App跳转支付分需要引用新的openSDK
Android openSDK下载地址(版本>=5.3.1):Android资源下载
Android 接入文档链接:openSDK说明文档
iOS openSDK下载地址(版本>=1.8.4):iOS资源下载
iOS 接入文档链接:openSDK说明文档
接口名称:WXOpenBusinessView
● iOS兼容性表现:若微信版本 >= 7.0.3,开发者可以通过此openSDK接口跳转到微信支付分小程序;若微信版本 < 7.0.3,开发者通过此openSDK接口可以跳转到微信,但不能跳转到微信支付分小程序,此时微信会提示用户可能由于应用的请求非法或者微信版本过低。
● Android兼容性表现:若微信版本>=7.0.3,开发者可以通过此openSDK接口跳转到微信支付分小程序;若微信版本< 7.0.3,开发者通过此openSDK接口不能跳转到微信,此时开发者应提示用户更新微信版本。
Android对应对象:WXOpenBusinessView.Req
iOS对应对象:WXOpenBusinessViewReq
参数名 | 变量 | 类型[长度限制] | 必填 | 描述 |
---|---|---|---|---|
跳转类型 | businessType | string[1,16] | 是 | 固定配置:wxpayScoreUse 示例值:wxpayScoreUse |
+业务参数 | query | string[1,2048] | 是 | 使用URL的query string 方式传递参数,格式为key=value&key2=value2,其中value,value2需要进行UrlEncode处理。 示例值:见query示例 |
其他配置 | extInfo | string[1,128] | 否 | 自定义ext信息,json格式,如需指定小程序版本,可填 {"miniProgramType": type},默认正式版。
type取值: |
Android 返回字段:WXOpenBusinessView.Resp
iOS返回字段:WXOpenBusinessViewResp
参数名 | 变量 | 类型[长度限制] | 必填 | 描述 |
---|---|---|---|---|
跳转类型 | businessType | string[1,16] |
是 | 打开的业务类型。 示例值:wxpayScoreUse |
+返回信息 | extMsg | string |
是 | 支付分返回的业务数据,json格式。 示例值:见extMsg示例 |
WXOpenBusinessViewReq *req = [WXOpenBusinessViewReq object];
req.businessType = @"wxpayScoreUse";
req.query = @"mch_id=1230000109&package=XXXXXXXX&
timestamp=1530097563&
nonce_str=zyx53Nkey8o4bHpxTQvd8m7e92nG5mG2&sign_type=HMAC-SHA256&sign=029B52F67573D7E3BE74904BF9AEA";
req.extInfo = @"{\"miniProgramType\":0}";
[WXApi sendReq:req];
接口名称: openBusinessView
此接口引用 JSAPI版本1.5.0,引用地址:https://res.wx.qq.com/open/js/jweixin-1.5.0.js。
要求用户微信版本>=7.0.5
参数名 | 变量 | 类型[长度限制] | 必填 | 描述 |
---|---|---|---|---|
跳转类型 | businessType | string[1,16] | 是 | 固定配置:wxpayScoreUse 示例值:wxpayScoreUse |
+业务参数 | queryString | string[1,2048] | 是 | 使用URL的query string方式传递参数,格式为key=value&key2=value2,其中value,value2需要进行UrlEncode处理。 示例值:见queryString示例 |
参数名 | 变量 | 类型[长度限制] | 必填 | 描述 |
---|---|---|---|---|
返回码 | err_code | Number/string[1,32] | 是 | 返回码,由于iOS和Android实现的差异,err_code类型可能为Number或string ,所以在判断支付分是否成功返回商户的H5时,需要对err_code做整型化处理。 示例值: iOS:0 Android:'0' |
返回信息 | err_msg | string[1,128] | 是 | 返回信息 示例值:openBusinessView:ok |
+业务参数 | extraData | Object | 否 | 当err_code为0时,extraData才返回;反之,则不返回。 |
注意:只有用户点支付分页面内返回按钮时,才会带上返回参数;如果用户左滑返回或者点击页面左上角的返回图标返回,则不会带上返回参数。所以推荐在【查询订单】接口使用out_order_no作为入参。另外商户侧后台在创建支付分订单时需向前端返回out_order_no,同时前端需缓存out_order_no,以便在接口回调中查询订单状态。
let wechatInfo = navigator.userAgent.match(/MicroMessenger\/([\d\.]+)/i);
let wechatVersion = wechatInfo[1];
if (compareVersion(wechatVersion, '7.0.5') >= 0) {
goToWXScore();
} else {
// 提示用户升级微信客户端版本
window.href = 'https://support.weixin.qq.com/cgi-bin/readtemplate?t=page/common_page__upgrade&
text=text005&btn_text=btn_text_0'
}
/**
* 跳转微信支付分
*/
function goToWXScore() {
wx.checkJsApi({
jsApiList: ['openBusinessView'], // 需要检测的JS接口列表
success: function (res) {
// 以键值对的形式返回,可用的api值true,不可用为false
// 如:{"checkResult":{"openBusinessView":true},"errMsg":"checkJsApi:ok"}
if (res.checkResult.openBusinessView) {
wx.invoke(
'openBusinessView', {
businessType: 'wxpayScoreUse',
queryString
: 'mch_id=1230000109&package=xxxxx&
timestamp=1530097563&nonce_str=zyx53Nkey8o4bHpxTQvd8m7e92nG5mG2&sign_type=HMAC-SHA256&
sign=029B52F67573D7E3BE74904BF9AEA'
},
function (res) {
// 从支付分返回时会执行这个回调函数
if (parseint(res.err_code) === 0) {
// 返回成功
} else {
// 返回失败
}
});
}
}
});
}
/**
* 版本号比较
* @param {string
} v1
* @param {string
} v2
*/
function compareVersion(v1, v2) {
v1 = v1.split('.')
v2 = v2.split('.')
const len = Math.max(v1.length, v2.length)
while (v1.length < len) {
v1.push('0')
}
while (v2.length < len) {
v2.push('0')
}
for (let i = 0; i < len; i++) {
const num1 = parseint(v1[i])
const num2 = parseint(v2[i])
if (num1 > num2) {
return 1
} else if (num1 < num2) {
return -1
}
}
return 0
}
商户小程序跳转微信侧小程序建议使用两种方式:调用wx.openBusinessView或者wx.navigateToMiniProgram。其中wx.openBusinessView不占用小程序跳转其他小程序的数量名额。
接口名称:wx.openBusinessView
接口兼容:
●小程序版本库 >= 2.6.0,低版本需提示用户升级微信版本。
● iOS兼容性表现:若微信版本 >= 7.0.3,开发者可以通过此openSDK接口跳转到微信支付分小程序;若微信版本 < 7.0.3,开发者通过此openSDK接口可以跳转到微信,但不能跳转到微信支付分小程序,此时微信会提示用户可能由于应用的请求非法或者微信版本过低。
● Android兼容性表现:若微信版本>=7.0.3,开发者可以通过此openSDK接口跳转到微信支付分小程序;若微信版本< 7.0.3,开发者通过此openSDK接口不能跳转到微信,此时开发者应提示用户更新微信版本。
参数名 | 变量 | 类型[长度限制] | 必填 | 描述 |
---|---|---|---|---|
跳转类型 | businessType | string[1,32] | 是 | 固定配置:wxpayScoreUse 示例值:wxpayScoreUse |
+业务参数 | extraData | Object | 是 | 需要传递给支付分的业务数据。 |
if (wx.openBusinessView) {
wx.openBusinessView({
businessType: 'wxpayScoreUse',
extraData: {
package: 'XXXXXXXX'
},
success() {
//dosomething
},
fail() {
//dosomething
},
complete() {
//dosomething
}
});
} else {
//引导用户升级微信版本
}
接口名称: wx.navigateToMiniProgram,详见小程序API文档。
接口兼容:每个小程序可跳转的其他小程序数量限制为不超过 10 个。
参数名 | 变量 | 类型[长度限制] | 必填 | 描述 |
---|---|---|---|---|
公众号ID | appId | string[1,32] | 是 | 支付分公众账号ID,固定配置:wxd8f3793ea3b935b8。 示例值:wxd8f3793ea3b935b8 |
路径 | path | string[1,64] | 是 | 固定配置:pages/use/use 示例值:pages/use/use |
+业务参数 | extraData | Object | 是 | 需要传递给支付分的业务数据。 |
wx.navigateToMiniProgram({
appId: 'wxd8f3793ea3b935b8',
path: 'pages/use/use',
extraData: {
package: 'XXXXXXXX',
},
success() {
//dosomething
},
fail() {
//dosomething
},
complete() {
//dosomething
}
});
触发场景: 用户从商户小程序页面进入到支付分后再返回到商户小程序页面。
返回参数:商户小程序可在 App.onLaunch,App.onShow 中获取到这份数据。
参数名 | 变量 | 类型[长度限制] | 必填 | 描述 |
---|---|---|---|---|
业务参数 | query_id | string[1,64] | 是 | 单据查询id,对应【查询订单】接口中入参query_id。 示例值:XXXXXXXX |
注意: 只有用户点击支付分页面内返回按钮时,才会带上返回参数;如果用户点击页面左上角的返回图标按钮,则不会带上返回参数。
// app.js
onShow(res) {
if (res.scene === 1038) { // 场景值1038:从被打开的小程序返回
const { appId, extraData } = res.referrerInfo;
if (appId === miniprogram_appid) { // miniprogram_appid由【创建订单】返回,建议检查是否等于appId,不强制
let query_id = extraData.query_id;
let result = this.queryOrderStatus(query_id);
if (result) {
// 成功
} else {
// 失败
}
}
}
}
/**
* 查询订单状态函数
* 由商家后台服务提供
* @param query_id {string
} 单据id,可以在接口【查询订单】进行单据查询
*/
queryOrderStatus: function(query_id) {
// 商家小程序向商家后台服务请求查询订单状态,
// 这里的前后端接口和数据协议由商家侧设计
// 函数返回查询结果,这里以布尔值true代表成功,布尔值false代表失败
}
最新更新时间:2022.06.16 版本说明
微信支付分通过确认订单通知接口将用户确认订单消息通知给商户
• 同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。 推荐的做法是,当商户系统收到通知进行处理时,先检查对应业务数据的状态,并判断该通知是否已经处理。如果未处理,则再进行处理;如果已处理,则直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
• 如果在所有通知频率(通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)后没有收到微信侧回调,商户应调用查询订单接口确认订单状态。
特别提醒:商户系统对于确认订单通知的内容一定要做签名验证,并校验通知的信息是否与商户侧的信息一致,防止数据泄露导致出现“假通知”,造成资金损失。
适用对象:从业机构
请求URL:该链接是通过商户[创建支付分订单]提交notify_url参数,必须为https协议。如果链接无法访问,商户将无法接收到微信通知。 通知url必须为直接可访问的url,不能携带参数。示例: “http://pay.weixin.qq.com/wxpay/pay.action”
用户确认完成后,微信后台会把相关确认结果和订单信息发送给商户,商户需要接收处理该消息,并返回应答。
对后台通知交互时,如果微信收到商户的应答不符合规范或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 (通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)
用户确认结果通知是以POST 方法访问商户设置的通知url,通知的数据以JSON 格式通过请求主体(BODY)传输。通知的数据包括了加密的支付结果详情。
(注:由于涉及到回调加密和解密,商户必须先设置好apiv3密钥后才能解密回调通知,apiv3密钥设置文档指引详见APIv3密钥设置指引)
下面详细描述对通知数据进行解密的流程:
注: AEAD_AES_256_GCM算法的接口细节,请参考rfc5116。微信支付使用的密钥apiv3 key长度为32个字节,随机串nonce长度12个字节,associated_data长度小于16个字节并可能为空。
参数名 | 变量 | 类型[长度限制] | 必填 | 描述 |
---|---|---|---|---|
通知ID | id | string[1,36] | 是 | 通知的唯一ID。 示例值:EV-2018022511223320873 |
通知创建时间 | create_time | string[1,32] | 是 | 通知创建的时间,格式为yyyyMMddHHmmss(标准iso8601时间格式) 遵循rfc3339标准格式,格式为yyyy-MM-DDTHH:mm:ss+TIMEZONE,yyyy-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss.表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示北京时间2015年05月20日13点29分35秒。 示例值:2015-05-20T13:29:35+08:00 |
通知类型 | event_type | string[1,32] | 是 | 通知的类型 用户确认成功通知的类型为PAYSCORE.USER_CONFIRM 支付成功通知的类型为PAYSCORE.USER_PAID 示例值:PAYSCORE.USER_CONFIRM |
通知数据类型 | resource_type | string[1,32] | 是 | 通知的资源数据类型,确认成功通知为encryptresource。 示例值:encrypt-resource |
+通知数据 | resource | object | 是 | 通知资源数据 json格式,见示例 |
回调摘要 | summary | string[1,64] | 是 | 回调摘要 示例值:确认订单 |
加密不能保证通知请求来自微信。微信会对发送给商户的通知进行签名,并将签名值放在通知的HTTP头Wechatpay-Signature。商户应当验证签名,以确认请求来自微信,而不是其他的第三方。签名验证的算法请参考 《微信支付API v3签名验证》。
{
"id":"EV-2018022511223320873",
"create_time":"2015-05-20T13:29:35+08:00",
"resource_type":"encrypt-resource",
"event_type":"PAYSCORE.USER_CONFIRM",
"resource" : {
"algorithm":"AEAD_AES_256_GCM",
"ciphertext": "...",
"nonce": "...",
"associated_data": ""
},
"summary": "确认订单"
}
{
"service_id": "500001",
"appid": "wxd678efh567hg6787",
"mchid": "1230000109",
"sub_appid": "wxd678efh567hg6999",
"sub_mchid": "1900000109",
"out_order_no": "1234323JKHDFE1243252",
"sub_openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o",
"state": "DOING",
"state_description": "USER_CONFIRM",
"service_introduction": "嗨客餐厅用餐",
"total_amount": "40000",
"post_payments": [
{
"name": "服务费",
"amount": 40000,
"description": "每分钟1元"
}
],
"post_discounts": [
{
"name": "满20减1元",
"amount": 1,
"description": "不与其他优惠叠加"
}
],
"risk_fund": {
"name": "预估订单费用",
"amount": 10000,
"description": "就餐的预估费用"
},
"time_range": {
"start_time": "20091225091010",
"start_time_remark": "xxx",
"end_time": "20091225091210",
"end_time_remark": "xxx"
},
"location": {
"start_location": "嗨客时尚主题展餐厅",
"end_location": "嗨客时尚主题展餐厅"
},
"attach": "attach",
"order_id": "165461131",
"need_collection": true
}
参数名 | 变量 | 类型[长度限制] | 必填 | 描述 |
---|---|---|---|---|
服务ID | service_id | string[1,32] | 是 | 调用创单接口时传入的服务ID。 示例值:500001 |
应用ID | appid | string[1,32] | 是 | 调用创单接口时传入的应用ID。 示例值:wxd678efh567hg6787 |
商户号 | mchid | string[1,32] | 是 | 调用创单接口时提交的商户号。 示例值:1230000109 |
子商户应用ID | sub_appid | string[1,32] | 否 | 调用创单接口时传入的子商户应用ID 示例值:wxd678efh567hg6999 |
子商户商户号 | sub_mchid | string[1,32] | 是 | 调用创单接口时传入的子商户商户号 示例值:1900000109 |
渠道商商户号 | channel_id | string[1,32] | 否 | 调用创单接口时传入的渠道商商户号 示例值:1900000110 |
商户服务订单号 | out_order_no | string[1,32] | 是 | 调用创单接口时提交的商户服务订单号。 示例值:1234323JKHDFE1243252 |
从业机构公众号下的用户标识 | openid | string[1,128] | 否 | 微信用户在商户对应appid下的唯一标识。(传了sub_appid的情况下则只返回sub_openid) 示例值:oUpF8uMuAJO_M2pxb1Q9zNjWeS6o |
子商户公众号下的用户标识 | sub_openid | string[1,128] | 否 | 微信用户在商户对应sub_appid下的唯一标识。(传了sub_appid的情况下则只返回sub_openid) 示例值:oUpF8uMuAJO_M2pxb1Q9zNjWeS6o |
服务订单状态 | state | string[1,32] | 是 | 表示当前单据状态。 枚举值: DOING:服务订单进行中 示例值:DOING |
订单状态说明 | state_description | string[1,32] | 否 | 对服务订单"进行中"状态的附加说明。 USER_CONFIRM:用户确认 示例值:USER_CONFIRM |
服务信息 | service_introduction | string[1,20] | 是 | 服务信息,用于介绍本订单所提供的服务,
不超过20个字符,超出报错处理 示例值:XX充电宝 |
商户收款总金额 | total_amount | int64 | 否 | 总金额,大于等于0的数字,单位为分,只能为整数,详见支付金额。 需满足:总金额=付费项目金额之和-商户优惠项目金额之和<=订单风险金额 未使用服务,取消订单时,该字段必须填0. 示例值:40000 |
+后付费项目 | post_payments | array | 是 | 付费项目列表,最多包含100条付费项目。 |
+商户优惠 | post_discounts | array | 否 | 商户优惠列表,最多包含5条商户优惠。 |
+订单风险金 | risk_fund | object | 是 | 订单风险金信息 |
+服务时间段 | time_range | object | 是 | 服务使用时间范围 |
+服务位置 | location | object | 否 | 服务使用位置信息。 |
商户数据包 | attach | string[1,200] | 否 | 商户数据包可存放本订单所需信息,需要先urlencode后传入。 当商户数据包总长度超出256字符时,报错处理。 示例值:attach |
微信支付服务订单号 | order_id | string[1,64] | 否 | 微信支付服务订单号,每个微信支付服务订单号与商户号下对应的商户服务订单号一一对应。 示例值:15646546545165651651 |
是否需要收款 | need_collection | bool | 否 | 是否需要收款。 true:微信支付分代收款 false:无需微信支付分代收款 示例值:false |
接收成功:HTTP应答状态码需返回200或204,无需返回应答报文。
接收失败:HTTP应答状态码需返回5XX或4XX,同时需返回应答报文,格式如下:
参数名 | 变量 | 类型[长度限制] | 必填 | 描述 |
---|---|---|---|---|
返回状态码 | code | string[1,32] | 是 | 错误码,SUCCESS为接收成功,其他错误码为失败。 示例值:FAIL |
返回信息 | message | string[1,64] | 是 | 返回信息,如非空,为错误原因。 示例值:失败 |
{
"code": "FAIL",
"message": "失败"
}