2. 开发者注册与商户信息获取
2.1 概述与原理
接入支付SDK的首要环节是完成开发者身份注册与商户信息获取。支付平台通过商户号(Merchant ID)唯一标识一个商户实体,()用于接口签名认证,签名证书则承载了商户的私钥身份。三者共同构成支付接口调用的信任基础。
核心依赖关系:开放平台账号 → 应用(App)→ 商户号(MID)→ + 签名证书。每一步的产出都是下一步的输入,不可跳级。
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... |
获取 的操作步骤:
- 登录开放平台 → 进入【应用管理】→ 选择已创建的应用。
- 找到【开发配置】或【API 安全】栏目。
- 点击【生成 】或【重置密钥】。
- 使用手机验证码或 U 盾进行安全验证。
- 复制密钥并保存到安全位置(部分平台仅展示一次)。
2.4.2 签名证书下载与安装
签名证书是商户私钥的载体,用于签发退款、关单、对账等敏感操作的请求。证书通常为 .p12 或 .pem 格式,并受证书密码保护。
证书下载流程与示例命令:
- 在开放平台【账户中心】→【API 证书】栏目提交申请。
- 平台生成证书后,通过短信验证码确认身份。
- 下载证书文件(通常为
apiclient_cert.p12)。 - 使用 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 }