JSAPI 网页支付
说明
- 使用前先再 XorPay 后台 设置域名支付目录,最多设置5个支付授权目录, 且域名必须通过 ICP 备案
- 先通过 获取openid 接口获得用户 openid
- 然后请求接口,获得 jsapi 支付参数,再在网页用 WeixinJSBridge 调起支付
- 调用方法为 POST, content-type 为 application/x-www-form-urlencoded
接口地址
https://xorpay.com/api/pay/aid 其中 aid 为用户 appid,请在 XorPay 后台 查看后替换
接口参数
名称 | 类型 | 必须 | 说明 |
---|---|---|---|
name | string | 是 | 商品名称 |
pay_type | string | 是 | jsapi |
price | string | 是 | 价格如: 50.00 |
order_id | string | 是 | 你平台订单号,需要唯一 |
order_uid | string | 否 | 订单用户如: [email protected] |
notify_url | string | 是 | 回调地址 |
return_url | string | 否 | 支付成功后前台跳转地址(需联系客服开通点金计划) |
openid | string | 是 | 支付用户的openid |
more | string | 否 | 订单其他信息,回调时原样传回 |
expire | int | 否 | 订单过期秒数,默认 7200 |
sign | string | 是 | 将参数按 name + pay_type + price + order_id + notify_url + app secret 顺序拼接后MD5(纯 value 拼接,不要包含 + 号) |
POST body 举例:
pay_type=native&name=XorPay+ %E8%B4%A6%E6%88%B7%E5%85%85%E5%80%BC&order_uid=a%40b.com&order_id=14&price=0.01&sign=23f 486d9bb15x6b11f753547558626d7¬ify_url=http%3A%2F%2Fexample.com%3A3094%2Fpay_callback
返回参数
返回为 json 格式
名称 | 类型 | 必有 | 说明 |
---|---|---|---|
status | string | 是 | 只有在 ok 的情况下才有后面的参数ok 成功missing_argument 缺少参数app_off 账号被冻结aid_not_exist aid不存在pay_type_error 支付类型错误sign_error 签名错误order_payed 订单已支付order_expire 订单过期wechat_api_error 可能账号被风控fee_error 余额不足order_exist 同一订单,参数不同invalid_openid 请确保用我们提供的 openid 接口获取 openid,不能用自己公众号或小程序的 openid |
aoid | string | 否 | XorPay 平台统一订单号 |
expire_in | int | 否 | 订单过期秒数 |
info | dict | 否 | appId jsapi支付参数timeStamp jsapi支付参数nonceStr jsapi支付参数package jsapi支付参数signType jsapi支付参数paySign jsapi支付参数 |
前端页面调起支付 JS
function onBridgeReady(){
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId" : "wxeeeeeeeeeeeeeeee", //公众号名称,由商户传入
"timeStamp":"0000000000", //时间戳,自1970年以来的秒数
"nonceStr" : "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", //随机串
"package" : "prepay_id=bbbbbbbbbbbbbbbbbbbbb",
"signType" : "MD5", //微信签名方式:
"paySign" : "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" //微信签名
},
function(res){
// 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg 将在用户支付成功后返回 ok,但并不保证它绝对可靠。
if(res.err_msg == "get_brand_wcpay_request:ok" ) {}
}
);
}
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
}
}else{
onBridgeReady();
}