第2章 开发者注册与商户信息获取

2.1 概述与原理

接入支付SDK的首要环节是完成开发者身份注册与商户信息获取。支付平台通过商户号(Merchant ID)唯一标识一个商户实体,()用于接口签名认证,签名证书则承载了商户的私钥身份。三者共同构成支付接口调用的信任基础。

核心依赖关系:开放平台账号 → 应用(App)→ 商户号(MID)→ + 签名证书。每一步的产出都是下一步的输入,不可跳级。
开发者注册与商户信息获取流程 开放平台注册 个人/企业认证 创建应用 选择应用类型 获取商户号 MID 唯一标识 获取 签名 & 加密 下载签名证书 商户私钥文件 ⚠ 安全提醒 密钥与证书严禁明文存储 生产环境需硬件加密机 (HSM) 环境隔离建议 沙箱环境与生产环境 使用不同的商户号/密钥 前置条件:营业执照 / 身份证 → 注册 → 应用审核 → 商户号激活 → 密钥对生成 标准注册与信息获取路径

2.2 开放平台注册与实名认证

所有支付平台均要求开发者先完成开放平台账号注册,并提交企业/个人实名认证。以国内主流平台为例,认证通过后才会开放商户接入权限。

认证类型 所需材料 审核周期 接口权限差异
个人开发者 身份证 + 银行卡验证 即时 ~ 1个工作日 受限:提现额度、部分接口不可用
企业开发者 营业执照 + 法人身份证 + 对公账户 1 ~ 3个工作日 全接口开放,支持大额交易
个体工商户 营业执照 + 经营者身份证 1 ~ 2个工作日 大部分接口可用,额度适中
平台差异举例:微信支付要求必须先注册微信开放平台(或微信商户平台),支付宝则通过支付宝开放平台注册。海外平台如 Stripe 仅需邮箱注册 + 银行账户验证即可获得 。

2.3 创建应用与商户号获取

认证通过后,需在开放平台创建应用(App)。应用是商户功能聚合的载体,一个应用对应一个商户号(Merchant ID),部分平台支持一个应用下挂多个商户号用于多门店/多业务线的资金隔离。

创建应用的核心参数包括:

  • 应用名称 — 商户展示名称,审核后不可随意修改。
  • 应用类型 — 网页应用、移动应用、小程序等,决定了支付方式(JSAPI、App支付、小程序支付)。
  • 回调域名 — 支付结果的异步通知接收地址,最多可配置 5 个。
  • 应用图标 — 部分平台要求上传,用于支付页面展示。

提交应用审核后,平台会下发商户号。商户号是后续所有支付请求中的核心标识,需妥善记录:

// 商户号配置示例(非真实数据)
PAYMENT_MERCHANT_ID = "MCH123456789"       // 15位数字字母组合
PAYMENT_APP_ID      = "wx1234567890abcdef"  // 应用ID(微信)/ App ID(支付宝)
PAYMENT_ENV         = "sandbox"              // sandbox | production
关键注意:商户号是敏感标识,不得在客户端代码、前端页面或公开仓库中硬编码。应在后端环境变量或配置中心中存储,并严格限制访问权限。

2.4 与签名证书获取

商户号激活后,需要获取()和签名证书才能发起支付请求。

2.4.1 的作用与获取

用于接口签名和敏感数据加密。每次支付请求需要用密钥对参数进行 HMAC-SHA256 或 MD5 签名,服务端验签通过后才会处理。

参数 说明 示例值
32 位随机字符串,区分大小写 aB3dEfGhIjKlMnOpQrStUvWxYz123456
App Secret 与应用 ID 配对,用于 OAuth 授权 sk_abc123def456ghi789jkl012
Public Key 部分平台用于回调验签 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...

获取 的操作步骤:

  1. 登录开放平台 → 进入【应用管理】→ 选择已创建的应用。
  2. 找到【开发配置】或【API 安全】栏目。
  3. 点击【生成 】或【重置密钥】。
  4. 使用手机验证码或 U 盾进行安全验证。
  5. 复制密钥并保存到安全位置(部分平台仅展示一次)。

2.4.2 签名证书下载与安装

签名证书是商户私钥的载体,用于签发退款、关单、对账等敏感操作的请求。证书通常为 .p12 或 .pem 格式,并受证书密码保护。

证书下载流程与示例命令:

  1. 在开放平台【账户中心】→【API 证书】栏目提交申请。
  2. 平台生成证书后,通过短信验证码确认身份。
  3. 下载证书文件(通常为 apiclient_cert.p12)。
  4. 使用 OpenSSL 查看证书信息(可选)。
# 查看 p12 证书内容(非必须,仅验证)
openssl pkcs12 -info -in apiclient_cert.p12 -nodes -passin pass:证书密码

# 将 p12 转换为 pem 格式(某些 SDK 需要)
openssl pkcs12 -in apiclient_cert.p12 -out apiclient_cert.pem -nodes -passin pass:证书密码

# 提取商户私钥(用于服务端签名)
openssl pkcs12 -in apiclient_cert.p12 -nocerts -out merchant_private_key.pem -passin pass:证书密码 -passout pass:新密码
生产建议:证书文件应放在受保护的目录(如 /etc/payment/certs/),权限设为 600。使用 Docker 部署时可挂载为 secrets 卷,不要打包进镜像。

2.5 配置信息管理与环境隔离

开发、测试、生产环境应使用不同的商户号、密钥和证书,避免测试数据污染线上资金。推荐的结构化配置方案如下:

// config/payment.php (伪代码示例)
return [
  'environments' => [
    'sandbox' => [
      'merchant_id' => 'MCH_SANDBOX_001',
      'app_id'      => 'wx_sandbox_app_id',
      ''     => 'sandbox_key_32chars_testonly!!',
      'cert_path'   => '/etc/payment/certs/sandbox/apiclient_cert.p12',
      'cert_pass'   => 'sandbox_cert_pass_123',
    ],
    'production' => [
      'merchant_id' => getenv('PROD_MERCHANT_ID'),
      'app_id'      => getenv('PROD_APP_ID'),
      ''     => getenv('PROD_'),
      'cert_path'   => getenv('PROD_CERT_PATH'),
      'cert_pass'   => getenv('PROD_CERT_PASS'),
    ],
  ],
  'default_env' => 'sandbox',
];
安全红线:永远不要将生产环境的密钥、证书密码、私钥文件提交到 Git 仓库。使用 .env 文件 + 环境变量注入,并开启 Git 加密(如 git-crypt / BlackBox)保护敏感字段。

2.6 常见错误与排查

错误现象 根因 解决方法
签名校验失败 与平台不一致,或签名算法不匹配 重新复制 ,确认签名类型(MD5 / HMAC-SHA256)
证书密码错误 证书密码中包含了不可见字符或换行符 从平台复制密码时确保无前后空格,使用 cat -A 检查
商户号与应用不匹配 使用了其他应用的商户号 在应用详情页核对绑定关系,解绑后重新绑定
证书过期 证书有效期一年,到期未更新 在开放平台重新申请并下载新证书,设置到期前 30 天告警
回调验签失败 未使用正确的公钥/证书进行验签 区分签名证书(私钥)和平台公钥(验签),下载平台公钥文件
调试技巧:在沙箱环境首次获取商户信息后,先调用「查询商户状态」API 验证配置是否正确。请求体只需传入商户号 + 签名,是最轻量的联通性测试。示例请求结构:
{ "merchant_id": "MCH_SANDBOX_001", "sign": "计算得到的签名值", "timestamp": 1700000000 }

2.7 本章小结