一、目标接入场景
针对已经在微信建立自己的B2B小程序的品牌商/经销商/批发商,在小程序上已完成门店认证的小B向大B进行支付时,可在原有微信订单资金管控的基础上,对符合微信要求的B2B交易实现实时资金解冻。
二、接入方案和流程说明
1、接入准备
大B商户/小程序开发者需在小程序完成:
1. 完成B2b类目认证
登陆小程序管理后台(https://mp.weixin.qq.com/), 找到「设置基本信息服务类目」,添加[商家自营-B2b(商品批发门店管理)]类目
2. 开通门店助手服务
左侧导航栏[行业能力]下找到[B2b门店助手],在页面点击[开通]后,填写小程序基本信息,点击[提交]即可完成开通
3. 引入门店认证插件
a. 添加插件:登录小程序后台(mp.weixin.qq.com), 点击左下方头像,“账号设置第三方设置_插件管理-添加插件”,搜索“小程序门]店助手”并申请添加,也可以使用开发者工具运行小程序,并引入插件,在调试器中会提示‘添加插件"”,点击添加插件,前往小程序管理后台确认
c. 小程序前端改造:在小程序的流程设计中,需引导用户进入”小程序店助手“插件页面,完成门店认证授权流程。只有完成门店认证授权的用户,方可获取用户的门店信息、使用模板消息功能以及享受优惠费率。案例如下:
d. 完成门店信息预录入:支持微信后台录入或API录入(https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/industry/B2b_store_assistant.html#_2-5-%E3%80%90%E8%BF%9B%E9%98%B6%E5%8A%9F%E8%83%BD%E3%80%91%E9%A2%84%E5%BD%95%E5%85%A5%E9%97%A8%E5%BA%97%E4%BF%A1%E6%81%AFapi)
4. 引导交易用户完成门店认证
5. 完成B2B 专用支付接口接入(见下文第三点对接指引)
2、交易商户号配置
1. 启用专用商户号
微信建议专号专用,使用专用的商户号来进行B2B交易,未完成门店认证的用户,建议使用其他商户号以及普通支付接口进行行支付,避免微信风控。
2. 完成商户微信开户意愿确认
3. 配置小程序APPID
对专用商户号配置B2B对应的小程序APPID
注意:
1) APPID必须是资金管控的APPID
2) 专用商户号不能配置其他不符合B2B要求的APPID,否则无法完成活动报名
4. 完成活动报名
为实现免账期,还需要在交易之前完成大B商户号优惠费率活动报名:《线上批发小程序活动》
报名路径:
1)页面报名:请联系通联支付分公司客户经理操作。(企业微信-商户服务-其他服务-热门活动)
2)API报名:接口地址https://prodoc.allinpay.com/doc/1456/
3、交易说明
1. 交易类型说明
B2B交易对应的交易类型是【微信订单预消费】(paytype=W11),本质上与微信订单预消费资金管控逻辑一致,只是符合B2B要求的交易,在交易后很快会补登【微信订单预消费完成交易】,达到资金的快速解冻。
详见云商通各版本的支付模式中,关于“微信小程序支付”的说明。
2. 使用专用支付接口
交易时,小程序需要提前判断用户是否为已经完成门店认证的小B,对于是的情况,需使用 B2B 专用支付接口代替常规的支付接口。对于未认证的门店,需使用微信小程序支付。
3. 业务时序图
大B小程序需要判断用户是否完成门店认证后,使用不同的商户号发起支付,并注意红色部分,在发起支付时使用对应的接口。
4. 其他提示
如果微信认为商户发生风险情况变化,仍会对商户进行账期管控。以微信实际管控为准。
三、B2B 间连专用支付小程序接口说明
小程序接口 wx.requestCommonPayment(Object object)
基础库3.8.6版本后支持(说明:由于该接口仍未向旧版本基础库进行覆盖,因此对接期间,请使用该版本进行开发。待开发验证无问题后,平台将进行旧版本基础库覆盖,此时方可正式对外使用)
请求参数
属性 |
类型 [长度限制] |
必填 |
描述 |
signData |
Object |
是 |
具体支付参数,详见signData,该参数以string传递。 |
mode |
string |
是 |
支付类型,固定填retail_pay_indirect_goods 示例值:retail_pay_indirect_goods |
success |
function |
否 |
接口调用成功的回调函数 |
fail |
function |
否 |
接口调用失败的回调函数 |
complete |
function |
否 |
接口调用结束的回调函数(调用成功、失败都会执行) |
1) signData
参数名 |
变量 |
类型 [长度限制] |
必填 |
描述 |
微信支付参数 |
requestPaymentInfo |
object |
是 |
支付信息,格式见requestPaymentInfo |
2)requestPaymentInfo
变量 |
类型 [长度限制] |
必填 |
描述 |
timeStamp |
string |
是 |
时间戳,从 1970 年 1 月 1 日 00:00:00 至今的秒数,即当前的时间 |
nonceStr |
string |
是 |
随机字符串,长度为32个字符以下 |
package |
string |
是 |
统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=*** |
signType |
string |
否 |
签名算法,应与后台下单时的值一致 |
paySign |
string |
是 |
签名,具体见微信支付文档 |
请求示例
const signDataObj = {
requestPaymentInfo: {
timeStamp: "1747019232",
nonceStr: "120899265cce4c39b95e4f31dff5ddc2",
package: "prepay_id=wx12110712204599f3186256a53fbfa90001",
signType: "RSA",
paySign:
"hqMkkLJr4wXqIoPfM5M2JLC51pFWRXSMwXwT0jsDxND+Jch7NNKylc8RC/JTyh+bYe5ALbm0Zru9bDeeGWFGvnRxtfWJ7K73LZ6RsvgVij7dE1uZNNtkjtYXqOTSXQAL5DsnQkZkru01XGqQbAFIda5qsUR3jc4Bx5D9bT4M6ogIrNlWbijkOybsoNn099IQAQbdtbO+HmGgkDAW07SdL1BLr7glyZVI0c2tuD+ssaM0PmHbCJq7M3v5gj8VX2GtGQEj85j67ZWAwtJTSoLbiT/y9Zy/xTLN9RxZ/WZ4hM1I21syfuLGKNw8azc08+LE2YgOGyUlWaQnQmFDxwwYfA==",
},
};
console.log("\n\n\n\n\n请求参数");
console.log(signDataObj);
// @ts-expect-error
wx.requestCommonPayment({
signData: JSON.stringify(signDataObj),
mode: "retail_pay_indirect_goods",
success: (res: any) => {
},
fail: (e: any) => {
},
});
返回参数
object.success 回调函数
属性 |
类型 |
说明 |
errMsg |
string |
调用成功信息 |
object.fail 回调函数
属性 |
类型 |
说明 |
errMsg |
string |
错误信息 |
errCode |
number |
错误码 |
错误码
错误码 |
说明 |
1000 |
系统错误 |
702009 |
B2b授权关系校验不通过 |