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&notify_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();
}

results matching ""

    No results matching ""