签约-小程序

更新时间: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 是否一致。

小程序调起签约示例

# 返回参数

# 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秒。

成功回调的参数示例

# fail 失败回调的参数
  • code 必填 string(32)
    【错误码】 详见错误码部分
  • message 必填 string(1024)
    【失败原因】 详不建议展示给用户,仅用于商户的开发人员定位失败原因

失败回调的参数示例

# complete 完成回调的参数

没有参数。
无论成功、失败都会触发complete回调。

# 错误码

错误码 描述 解决方案
PARAM_ERROR 参数错误 请根据失败原因检查传入参数
INVALID_REQUEST 请求失败 因业务原因失败,参数符合参数格式,但不符合业务规则,请查看失败原因
SIGN_ERROR 签名验证不通过 请参阅 签名常见问题 (opens new window)
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

更多技术问题
技术咨询
反馈
咨询
目录