签约-小程序

更新时间:2024.11.26

使用限制:

  1. 仅限已开通该接口权限的小程序调用,且调用方小程序的 AppID 必须与申请权限时提供的 AppID 一致。

  2. 微信 OpenSDK 没有默认集成本接口,商户小程序需要额外安装 NPM 依赖:

    1# 通过 NPM 安装: 微信支付(个人签约)小程序 SDK
    2npm install -S @tenpay/wechatpay-miniprogram-individual-contracts
  3. iOS 及 Android 微信客户端版本 8.0.51 开始支持。如客户端不支持,微信会向用户展示提示页面,并触发商户小程序失败回调。

接口说明

支持商户:【平台商户】

支持的调用端:【小程序】

接口名称:WeChatPayIndividualContracts.requestSign

提示

签约结果不能完全信任客户端结果,重要流程需要后台查询API确认, 以免后续交易流程校验失败。

字段说明

请求参数

mchid  必填 string(32)

【商户号】 平台商户号


appid 必填 string(32)

【小程序 AppID】 调用方小程序的 AppID,必须与申请权限时提供的 AppID 一致


package 必填 string(256)

【权限申请扩展字符串】需拼接用户标志 openid、权限类型 permissionType参数格式:openid=oZMw85eFXXGIa9IZwGdH9TF_lTPw&permissionType=INDIVIDUAL_PAYEE,目前 permissionType 仅支持 INDIVIDUAL_PAYEE


timeStamp 必填 string(32)

【签名时间戳】 签名时的系统时间戳,自格林威治时间 1970-01-01 00:00:00(北京时间 1970-01-01 08:00:00)至现在的总秒数。
注意: 部分系统取到的值为毫秒级,需要转换成秒(10位数字)。


nonceStr 必填 string(32)

【随机字符串】 签名使用的随机字符串,不超过 32 字节


signType 必填 string(32)

【签名类型】默认为 RSA,仅支持 RSA


certSerialNo 必填 string(64)

【证书序列号】签名使用的商户 API 证书序列号


signature 必填 string(512)

【签名值】使用字段 appid timeStamp nonceStr package 计算得出的签名值,具体算法见下文签名步骤。

签名所使用的 appid 为申请个人签约小程序时的 appid,微信支付会校验当前小程序与申请的 AppID 是否一致。

小程序调起签约示例

1import WechatPayIndividualContracts from "@tenpay/wechatpay-miniprogram-individual-contracts";
2
3WechatPayIndividualContracts.requestSign({
4  mchid: '1900000000',
5  appid: 'wx8888888888888888',
6  package: 'openid=oZMw85eFXXGIa9IZwGdH9TF_lTPw&permissionType=INDIVIDUAL_PAYEE',
7  timeStamp: '1414561699',
8  nonceStr: '5K8264ILTKCH16CQ2502SI8ZNMTM67VS',
9  signType: 'RSA',
10  certSerialNo: 'ABCDEFG0123456789',
11  signature: 'oR9d8PuhnIc+YZ8cBHFCwfgp...',
12  success: function (res) {
13    // 已确认收款, 结算结果以服务端回调为准
14  },
15  fail: function (err) {
16    // 确认收款失败, 详见: `err.code` `err.message`
17  },
18  complete: function () {
19    // 无论成功/失败均会回调
20  },
21});

 

返回参数

success 成功回调的参数

individualAuthId 必填 string(64)

【授权id】表示一个【微信支付用户账号id】与一个【商户】的授权关系


authState 必填 string(64)

【授权状态】授权的结果状态, 值为AUTHORIZED 已授权 或 UNAUTHORIZED 未授权


operationTime 必填 string(64)

【操作时间】遵循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秒。

成功回调的参数示例

1{
2  individualAuthId: "1236698745558870",
3  authState: "AAA12345678",
4  operationTime: "2024-05-20T13:29:35+08:00",
5}

 


fail 失败回调的参数

code 必填 string(32)

【错误码】详见错误码部分


message 必填 string(1024)

【失败原因】不建议展示给用户,仅用于商户的开发人员定位失败原因

失败回调的参数示例

1{
2  code: "PARAM_ERROR",
3  message: "timeStamp 格式有误"
4}
complete 完成回调的参数

没有参数。

无论成功、失败都会触发 complete 回调。

错误码

错误码

描述

解决方案

PARAM_ERROR

参数错误

请根据失败原因检查传入参数

INVALID_REQUEST

请求失败

因业务原因失败,参数符合参数格式,但不符合业务规则,请查看失败原因

SIGN_ERROR

签名验证不通过

请参阅 签名常见问题

NO_AUTH

无接口权限

请商户申请此接口的权限
注意:拉起确认签约的小程序 AppID 应与申请权限的 AppID 一致

RATELIMIT_EXCEEDED

频率超限

请降低请求接口频率

USER_ERROR

用户原因失败

客户端不受支持、账号异常或用户主动取消,请服务端等待回调或主动查询确认详情

ALREADY_EXISTS

资源已存在

尝试创建的资源已存在, 比如已签约

SYSTEM_ERROR

系统异常,请稍后再试

请稍后再试

NETWORK_ERROR

网络异常,请稍后再试

网络异常,请稍后再试

PLATFORM_NOT_SUPPORTED

平台不支持

平台不支持, 比如操作系统不支持; 操作系统、微信、小程序基础库版本过低的场景

签名步骤

构造待签名串

待签名串共有四行,每行为一个参数值,并以 \n(换行符,ASCII 编码值为 0x0A)结尾,最后一行也需要以 \n 结尾。

如果参数值以 \n 结束,也需要额外附加一个 \n

待签名串的结构:

1小程序AppID\n
2签名时间戳\n
3随机字符串\n
4结算详情扩展字符串\n

待签名串的内容示例:

1wx8888888888888888\n
21414561699\n
35K8264ILTKCH16CQ2502SI8ZNMTM67VS\n
4openid=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

 

 

反馈
咨询
目录
置顶