签约-小程序
更新时间:2024.11.08使用限制:
仅限已开通该接口权限的小程序调用,且调用方小程序的 AppID 必须与申请权限时提供的 AppID 一致。
微信 OpenSDK 没有默认集成本接口,商户小程序需要额外安装 NPM 依赖 (暂未发布,后续更新):
1# 通过 NPM 安装: 微信支付(个人签约)小程序 SDK2npm install -S @tenpay/wechatpay-miniprogram-individual-contractsiOS 及 Android 微信客户端版本 8.0.51 开始支持。如客户端不支持,微信会向用户展示提示页面,并触发商户小程序失败回调。
# 接口说明
支持商户:【平台商户】
支持的调用端:【小程序】
接口名称: WeChatPayIndividualContracts.requestSign
提示
签约结果不能完全信任客户端结果,重要流程需要后台查询API确认, 以免后续交易流程校验失败。
# 字段说明
# 请求参数
- mchid 必填【商户号】 平台商户号
- appid 必填【小程序 AppID】 调用方小程序的 AppID,必须与申请权限时提供的 AppID 一致
- package 必填【权限申请扩展字符串】 需拼接用户标志
openid
、权限类型permissionType
参数格式:openid=oZMw85eFXXGIa9IZwGdH9TF_lTPw&permissionType=INDIVIDUAL_PAYEE
,目前 permissionType 仅支持 INDIVIDUAL_PAYEE - timeStamp 必填【签名时间戳】 签名时的系统时间戳,自格林威治时间 1970-01-01 00:00:00(北京时间 1970-01-01 08:00:00)至现在的总秒数。
注意: 部分系统取到的值为毫秒级,需要转换成秒(10位数字)。 - nonceStr 必填【随机字符串】 签名使用的随机字符串,不超过 32 字节
- signType 必填【签名类型】 默认为
RSA
,仅支持RSA
- certSerialNo 必填【证书序列号】 签名使用的商户 API 证书序列号
- signature 必填【签名值】 使用字段
appid
timeStamp
nonceStr
package
计算得出的签名值,具体算法见下文签名步骤。
签名所使用的appid
为申请个人签约小程序时的appid
,微信支付会校验当前小程序与申请的 AppID 是否一致。
小程序调起签约示例
# 返回参数
# success 成功回调的参数
- individualAuthId 必填【授权id】 表示一个【微信支付用户账号id】与一个【商户】的授权关系
- authState 必填【授权状态】 授权的结果状态, 值为
AUTHORIZED
已授权 或UNAUTHORIZED
未授权 - operationTime 必填【操作时间】 遵循rfc3339标准格式,格式为yyyy-MM-DDTHH:mm:ss+TIMEZONE,yyyy-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日13点29分35秒。
成功回调的参数示例
# fail 失败回调的参数
- code 必填【错误码】 详见错误码部分
- message 必填【失败原因】 详不建议展示给用户,仅用于商户的开发人员定位失败原因
失败回调的参数示例
# complete 完成回调的参数
没有参数。
无论成功、失败都会触发complete
回调。
# 错误码
错误码 | 描述 | 解决方案 |
---|---|---|
PARAM_ERROR | 参数错误 | 请根据失败原因检查传入参数 |
INVALID_REQUEST | 请求失败 | 因业务原因失败,参数符合参数格式,但不符合业务规则,请查看失败原因 |
SIGN_ERROR | 签名验证不通过 | 请参阅 签名常见问题 (opens new window) |
NO_AUTH | 无接口权限 | 请商户申请此接口的权限 注意:拉起确认签约的小程序 AppID 应与申请权限的 AppID 一致 |
RATELIMIT_EXCEEDED | 频率超限 | 请降低请求接口频率 |
USER_ERROR | 用户原因失败 | 客户端不受支持、账号异常或用户主动取消,请服务端等待回调或主动查询确认详情 |
ALREADY_EXISTS | 资源已存在 | 尝试创建的资源已存在, 比如已签约 |
SYSTEM_ERROR | 系统异常,请稍后再试 | 请稍后再试 |
# 签名步骤
# 构造待签名串
待签名串共有四行,每行为一个参数值,并以 \n
(换行符,ASCII 编码值为0x0A
)结尾,最后一行也需要以\n
结尾。
如果参数值以 \n
结束,也需要额外附加一个 \n
。
待签名串的结构:
1小程序AppID\n2时间戳\n3随机字符串\n4结算详情扩展字符串\n
待签名串的内容示例:
1wx8888888888888888\n21414561699\n35K8264ILTKCH16CQ2502SI8ZNMTM67VS\n4openid=oZMw85eFXXGIa9IZwGdH9TF_lTPw&permissionType=INDIVIDUAL_PAYEE\n
# 计算签名值
使用商户私钥对 待签名串 进行SHA256 with RSA
签名,并对签名结果进行 Base64 编码,得到签名值signature
。
以命令行为例:
1echo -n -e \2"wx8888888888888888\n1414561699\n5K8264ILTKCH16CQ2502SI8ZNMTM67VS\nopenid=oZMw85eFXXGIa9IZwGdH9TF_lTPw&permissionType=INDIVIDUAL_PAYEE\n" \3 | openssl dgst -sha256 -sign apiclient_key.pem \4 | openssl base64 -A
输出结果示例:
1uOVRnA4qG/MNnYzdQxJanN+zU+lTgIcnU9BxGw5dKjK+VdEUz2FeIoC+D5sB/LN+nGzX3hfZg6r5wT1pl2ZobmIc6p0ldN7J6yDgUzbX8Uk3sD4a4eZVPTBvqNDoUqcYMlZ9uuDdCvNv4TM3c1WzsXUrExwVkI1XO5jCNbgDJ25nkT/c1gIFvqoogl7MdSFGc4W4xZsqCItnqbypR3RuGIlR9h9vlRsy7zJR9PBI83X8alLDIfR1ukt1P7tMnmogZ0cuDY8cZsd8ZlCgLadmvej58SLsIkVxFJ8XyUgx9FmutKSYTmYtWBZ0+tNvfGmbXU7cob8H/4nLBiCwIUFluw==
在以上计算签名值的过程中,没有使用到 signType
参数,但调用接口时仍需要传递默认值 RSA
。
文档是否有帮助