立即体验

你可以在此随机支付一笔一元以下的金额进行体验

请选择对应的支付方式

准备工作

前往xorpay官网签约微信及支付宝支付接口,正常工作日内一般1个工作日即可申请完成。

进入xorpay管理后台找到【应用配置】将「aid」和「app secret」填到本插件配置里即可开始使用。

在你的PHP代码中调用 \addons\xorpay\library\Service::submitOrder(金额, 唯一订单号,订单名称); 进行支付

签约支付接口

XorPay 支付发起方法

在您需要发起支付的方法里例如:order生成方法中添加如下代码。
\addons\xorpay\library\Service::submitOrder(金额, 唯一订单号,订单名称);
上面简单的参数即可快速发起支付。

完整DEMO如下

  1. //订单号,请换成你自己的订单系统的唯一订单号
  2. $out_order_id = \fast\Random::uuid();
  3. //这里配置两个回调地址,一个回调URL,一个支付完成/失败的返回URL
  4. $notifyurl = addon_url("xorpay/index/notifyit", [], true, true);
  5. $returnurl = addon_url("xorpay/index/returnit", [], true, true);
  6. //自定义附加传递的信息,例如可以用来传递会员ID、会员账号、商品ID等等
  7. $extend = 'custom';
  8. $more = $order->archives_id;//文章ID 拓展数据 可根据自己实际运用自行存储 该字段会跟随回调原样返回
  9. $order_uid = $auth->id;//订单用户ID 订单表及xorpay后台都会存储该ID
  10. //发起支付,并跳转到支付页面
  11. \addons\xorpay\library\Service::submitOrder($price, $out_order_id,'测试xorpay支付', $type, $notifyurl, $returnurl, $extend);

—注意支付参数的顺序;
— $type 填入”wechat” 或 “alipay” 默认使用 “wechat”;
— $paytype 与 $type 不同 $paytype指的是: 支付宝扫码、微信扫码、xorpay收银台、本地网页弹出支付,$paytype参数在submitOrder 时 不需要您填入,会根据你的$type及用户支付环境自动配置。
— $paytype说明:alipay(支付宝扫码支付)、native (微信扫码支付)、jsapi(xorpay收银台)、jsapi(网页支付)。
— jsapi支付方式为:xorpay收银台、本地网页支付,在后台插件配置中选择其一。xorpay收银台为跳转到xorpay调出支付窗口,本地则在自己网站调出支付窗口(需要openid)程序会自动跳转微信登录并获取用户openid。
— 使用jsapi(网页支付)需要联系xorpay客服设置支付目录 域名需备案,将你的域名/addons/xorpay/发送给客服设置即可。

XorPay 支付成功后回调方法

当订单支付成功后服务器会 立即 向你的服务器发起回调通知

当你收到回调请求后,如果响应HTTP 200(可以返回 ok/success 等字符)那么 XorPay 会认为通知成功,否则如果返回 HTTP 400/404/500 等其他状态码会认为通知失败, 会再次通知 6 次,间隔为 1/2/4/16/64/300 分钟。

notifyit 通知回调完整DEMO

  1. public function notifyit()
  2. {
  3. //以下返回参数是xorpay的固定返回参数,请保留原样接收
  4. $aoid = $this->request->request('aoid', '');
  5. $order_id = $this->request->request('order_id', '');
  6. $pay_price = $this->request->request('pay_price', '');
  7. $pay_time = $this->request->request('pay_time', '');
  8. $sign = $this->request->request('sign', '');
  9. $more = $this->request->request('more', '');
  10. $secret = $this->config['app_secret'];
  11. //请求xorpay 的签名 和回调回来的签名方式是不同的
  12. //回调签名方式:签名, 参数 aoid + order_id + pay_price + pay_time + app secret 顺序拼接后 MD5
  13. if ($sign != md5(join('',array($aoid, $order_id, $pay_price, $pay_time, $secret)))) {
  14. $this->error('签名错误');
  15. exit();
  16. }
  17. // 签名验证成功,更新数据
  18. try {
  19. $params = [
  20. 'paytime'=>$pay_time,
  21. 'status'=>'settled',
  22. ];
  23. if($aoid)
  24. {
  25. $params['aoid'] = $aoid;
  26. }
  27. Order::where('out_order_id',$order_id)->update($params);
  28. //此处编写您的业务逻辑 可是完成订单,增加会员余额等等操作
  29. } catch (Exception $e) {
  30. }
  31. //注意只能输出一个success
  32. echo "success";
  33. return;
  34. }

returnit 支付成功的返回完整DEMO

  1. public function returnit()
  2. {
  3. $order_id = $this->request->request('order_id', '');
  4. $sign = $this->request->request('sign', '');
  5. $config = get_addon_config('xorpay');
  6. $order = Order::get($order_id);
  7. if(count($order) == 0)
  8. {
  9. $this->error('查询订单失败');
  10. exit();
  11. }
  12. if ($sign != md5(join('',array($order['name'], $order['pay_type'], $order['price'], $order['out_order_id'], $order['notifyurl'], $config['app_secret'])))) {
  13. $this->error('签名错误');
  14. exit();
  15. }
  16. //你可以在这里定义你的提示信息,但切记不可在此编写逻辑
  17. $this->success("恭喜您成功支付".$order['price']."元!", addon_url("xorpay/index/index"));
  18. return;
  19. }

returnit 成功返回的方法里你可以填写提示及跳转的地址。
xorpay收银台付款方式付款成功将不会进入到returnit方法里,会自动跳转回支付前的页面上,无提示,页面会刷新。

CMS内容管理系统对接XorPay支付插件

CMS使用的是企业微信/支付宝接口如何使用XorPay?

https://www.dqdl.net/a/222.html

会员余额充值插件对接XorPay接口

FastAdmin 会员余额充值插件快速对接xorpay支付插件的方法

https://www.dqdl.net/a/223.html

支付宝当面付

说明
  • 调用方法为 POST, content-type 为 application/x-www-form-urlencoded
  • 请求该接口可以获取支付二维码
  • 用户用手机扫码可以支付
  • 需签约微信支付才能开通支付宝接口

接口地址

https://xorpay.com/api/pay/aid 其中 aid 为用户appid,请在 XorPay 后台 查看


接口参数
名称类型必须说明
namestring商品名称
pay_typestringalipay
pricefloat价格如: 50.00
order_idstring你平台订单号,需要唯一
order_uidstring订单用户如: abc@def.com
notify_urlstring回调地址
morestring订单其他信息,回调时原样传回
expireint订单过期秒数,默认 7200
signstring将参数按
name + pay_type + price + order_id + notify_url + app secret
顺序拼接后MD5(纯 value 拼接,不要包含 + 号)

POST body 举例:

pay_type=alipay&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 格式

名称类型必有说明
statusstring只有在 ok 的情况下才有后面的参数
ok 成功
no_contract 未签约
no_alipay_contract 未签约支付宝
missing_argument 缺少参数
app_off 账号被冻结
aid_not_exist aid不存在
pay_type_error 支付类型错误
sign_error 签名错误
order_payed 订单已支付
order_expire 订单过期
wechat_api_error 微信服务器错误
fee_error 余额不足
order_exist 同一订单,参数不同
aoidstringXorPay 平台统一订单号
expire_inint订单过期秒数
infodictqr 支付二维码

举例:

{u'status': u'ok', u'info': {u'qr': u'https://qr.alipay.com/baxbe6067atdzqfdxjcq20ff'}, u'expires_in': 7200, u'aoid': u'dfa20e231xf64069a615ecfme0m27x26'}

最后

返回结果里面 qr 既是支付二维码,用支付宝扫码即可支付;在大部分手机上(有小部分可能无法拉起支付宝app支付),跳转 qr 这个地址参数,可以拉起支付宝 app 支付(h5)

NATIVE 扫码支付

说明
  • 调用方法为 POST, content-type 为 application/x-www-form-urlencoded
  • 请求该接口可以获取支付二维码
  • 用户用手机扫码可以支付
  • 该二维码不能相册识别和长按识别

接口地址

https://xorpay.com/api/pay/aid 其中 aid 为用户appid,请在 XorPay 后台 查看


接口参数
名称类型必须说明
namestring商品名称
pay_typestringnative
pricefloat价格如: 50.00
order_idstring你平台订单号,需要唯一
order_uidstring订单用户如: abc@def.com
notify_urlstring回调地址
morestring订单其他信息,回调时原样传回
expireint订单过期秒数,默认 7200
signstring将参数按
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 格式

名称类型必有说明
statusstring只有在 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 同一订单,参数不同
aoidstringXorPay 平台统一订单号
expire_inint订单过期秒数
infodictqr 支付二维码

举例:

{u'status': u'ok', u'info': {u'qr': u'weixin://wxpay/bizpayurl?pr=jmmfbyN'}, u'expires_in': 7200, u'aoid': u'dfa20e231xf64069a615ecfee0527726'}

收银台支付

说明
  • 调用方法为 GET 或 POST(content-type 为 application/x-www-form-urlencoded)
  • 该接口自动获取用户 openid,然后调用 jsapi 接口发起支付
  • 该接口在微信浏览器里面发起支付
  • 该接口直接跳转网页支付页面,所以请构造好参数以后前端 GET/POST 到这个接口

接口地址

https://xorpay.com/api/cashier/aid 其中 aid 为用户appid,请在 XorPay 后台 查看


接口参数
名称类型必须说明
namestring商品名称
pay_typestringjsapi
pricefloat价格如: 50.00
order_idstring你平台订单号,需要唯一
order_uidstring订单用户如: abc@def.com
notify_urlstring回调地址
return_urlstring支付成功后前台跳转地址
cancel_urlstring取消支付跳转的地址
morestring订单其他信息,回调时原样传回
expireint订单过期秒数,默认 7200
signstring将参数按
name + pay_type + price + order_id + notify_url + app secret
顺序拼接后MD5(纯 value 拼接,不要包含 + 号)

POST body 举例:

pay_type=jsapi&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 格式

名称类型必有说明
statusstringok 成功
missing_argument 缺少参数
app_off 账号被冻结
aid_not_exist aid不存在
pay_type_error 支付类型错误
sign_error 签名错误
order_payed 订单已支付
order_expire 订单过期
wechat_api_error 微信服务器错误
fee_error 余额不足
order_exist 同一订单,参数不同

JSAPI 网页支付

说明
  • 使用前先设置jsapi域名支付目录,最多设置5个支付授权目录, 且域名必须通过 ICP 备案
  • FastAdmin - xorpay插件 自动会获取用户openid
  • 然后请求接口,获得 jsapi 支付参数,再在网页用 WeixinJSBridge 调起支付
  • 调用方法为 POST, content-type 为 application/x-www-form-urlencoded

接口地址

https://xorpay.com/api/pay/aid 其中 aid 为用户appid,请在 XorPay 后台 查看


接口参数
名称类型必须说明
namestring商品名称
pay_typestringjsapi
pricefloat价格如: 50.00
order_idstring你平台订单号,需要唯一
order_uidstring订单用户如: abc@def.com
notify_urlstring回调地址
openidstring支付用户的openid
morestring订单其他信息,回调时原样传回
expireint订单过期秒数,默认 7200
signstring将参数按
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 格式

名称类型必有说明
statusstring只有在 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 同一订单,参数不同
aoidstringXorPay 平台统一订单号
expire_inint订单过期秒数
infodictappId 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();
}

订单状态查询

说明
  • GET 方式

接口地址

https://xorpay.com/api/query/aoid 其中 aoid 为 XorPay 平台订单号


返回参数

返回为 json 格式

名称类型必有说明
statusstringnot_exist 订单不存在
new 订单未支付
payed 订单已支付,未通知成功
fee_error 手续费扣除失败
success 订单已支付,通知成功
expire 订单过期

回调通知

说明
  • 当订单支付成功后服务器会 立即 向你的服务器发起回调通知
  • POST 方式,content-type 为 application/x-www-form-urlencoded

接口地址

你传入的 notify_url 参数


请求参数
名称类型说明
aoidstringXorPay 平台订单唯一标识
order_idstring你传入的 order_id 参数
pay_pricefloat例如: 50.00
pay_timestring例如: 2019-01-01 00:00:00
morestring订单传过来的其他信息
detailstringjson格式,订单支付详细信息
transaction_id 渠道流水号
bank_type 用户付款方式
buyer 消费者
signstring签名, 参数 aoid + order_id + pay_price + pay_time + app secret 顺序拼接后 MD5

如何响应

当你收到回调请求后,如果响应HTTP 200(可以返回 ok/success 等字符)那么 XorPay 会认为通知成功,否则如果返回 HTTP 400/404/500 等其他状态码会认为通知失败, 会再次通知 6 次,间隔为 1/2/4/16/64/300 分钟。

退款接口

说明
  • 先联系管理员开通账号权限
  • 调用方法为 POST, content-type 为 application/x-www-form-urlencoded
  • 每个支付订单的部分退款次数不能超过 50 次

接口地址

https://xorpay.com/api/refund/aoid 其中 aoid 为 XorPay 平台订单号


接口参数
名称类型必须说明
pricefloat退款金额如: 50.00
signstring将参数按
price + app secret
拼接后MD5(纯 value 拼接,不要包含 + 号)

POST body 举例:

price=0.01&sign=23f86d9bb15x6b11f753547558626d7


返回参数

返回为 json 格式

名称类型必有说明
statusstringok 成功
order_error 订单状态不是success/或者订单不存在
price_error 退款金额大于收款金额
sign_error 签名错误
alipay_api_error 支付宝接口错误
infostring具体错误代码


注意:
1、本插件是将xorpay支付功能对接入FastAdmin框架,插件可实现快速对接微信/支付宝支付功能,后台插件配置中添加自己在xorpay申请的参数即可使用。
2、xorpay支付并非个人免签约类型靠APP监听收款通知从而实现完成订单的支付方式,微信支付需要签约微信支付微小商户、支付宝需要签约支付宝面对面付款产品,这两款支付产品个人用户即可签约,在xorpay后台可一站式签约。
3、关于插件使用过程中遇到的问题或BUG可以联系插件作者,关于支付接口的申请、接口费率的问题、支付目录设置的问题请联系xorpay官方的客服人员。