你可以在此随机支付一笔一元以下的金额进行体验
请选择对应的支付方式
前往xorpay官网签约微信及支付宝支付接口,正常工作日内一般1个工作日即可申请完成。
进入xorpay管理后台找到【应用配置】将「aid」和「app secret」填到本插件配置里即可开始使用。
在你的PHP代码中调用
\addons\xorpay\library\Service::submitOrder(金额, 唯一订单号,订单名称);
进行支付
在您需要发起支付的方法里例如:order生成方法中添加如下代码。
\addons\xorpay\library\Service::submitOrder(金额, 唯一订单号,订单名称);
上面简单的参数即可快速发起支付。
完整DEMO如下
//订单号,请换成你自己的订单系统的唯一订单号$out_order_id = \fast\Random::uuid();//这里配置两个回调地址,一个回调URL,一个支付完成/失败的返回URL$notifyurl = addon_url("xorpay/index/notifyit", [], true, true);$returnurl = addon_url("xorpay/index/returnit", [], true, true);//自定义附加传递的信息,例如可以用来传递会员ID、会员账号、商品ID等等$extend = 'custom';$more = $order->archives_id;//文章ID 拓展数据 可根据自己实际运用自行存储 该字段会跟随回调原样返回$order_uid = $auth->id;//订单用户ID 订单表及xorpay后台都会存储该ID//发起支付,并跳转到支付页面\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/发送给客服设置即可。
当订单支付成功后服务器会 立即 向你的服务器发起回调通知
当你收到回调请求后,如果响应HTTP 200(可以返回 ok/success 等字符)那么 XorPay 会认为通知成功,否则如果返回 HTTP 400/404/500 等其他状态码会认为通知失败, 会再次通知 6 次,间隔为 1/2/4/16/64/300 分钟。
notifyit 通知回调完整DEMO
public function notifyit(){//以下返回参数是xorpay的固定返回参数,请保留原样接收$aoid = $this->request->request('aoid', '');$order_id = $this->request->request('order_id', '');$pay_price = $this->request->request('pay_price', '');$pay_time = $this->request->request('pay_time', '');$sign = $this->request->request('sign', '');$more = $this->request->request('more', '');$secret = $this->config['app_secret'];//请求xorpay 的签名 和回调回来的签名方式是不同的//回调签名方式:签名, 参数 aoid + order_id + pay_price + pay_time + app secret 顺序拼接后 MD5if ($sign != md5(join('',array($aoid, $order_id, $pay_price, $pay_time, $secret)))) {$this->error('签名错误');exit();}// 签名验证成功,更新数据try {$params = ['paytime'=>$pay_time,'status'=>'settled',];if($aoid){$params['aoid'] = $aoid;}Order::where('out_order_id',$order_id)->update($params);//此处编写您的业务逻辑 可是完成订单,增加会员余额等等操作} catch (Exception $e) {}//注意只能输出一个successecho "success";return;}
returnit 支付成功的返回完整DEMO
public function returnit(){$order_id = $this->request->request('order_id', '');$sign = $this->request->request('sign', '');$config = get_addon_config('xorpay');$order = Order::get($order_id);if(count($order) == 0){$this->error('查询订单失败');exit();}if ($sign != md5(join('',array($order['name'], $order['pay_type'], $order['price'], $order['out_order_id'], $order['notifyurl'], $config['app_secret'])))) {$this->error('签名错误');exit();}//你可以在这里定义你的提示信息,但切记不可在此编写逻辑$this->success("恭喜您成功支付".$order['price']."元!", addon_url("xorpay/index/index"));return;}
returnit 成功返回的方法里你可以填写提示及跳转的地址。
xorpay收银台付款方式付款成功将不会进入到returnit方法里,会自动跳转回支付前的页面上,无提示,页面会刷新。
https://xorpay.com/api/pay/aid 其中 aid 为用户appid,请在 XorPay 后台 查看
| 名称 | 类型 | 必须 | 说明 |
|---|---|---|---|
| name | string | 是 | 商品名称 |
| pay_type | string | 是 | alipay |
| price | float | 是 | 价格如: 50.00 |
| order_id | string | 是 | 你平台订单号,需要唯一 |
| order_uid | string | 否 | 订单用户如: abc@def.com |
| notify_url | string | 是 | 回调地址 |
| more | string | 否 | 订单其他信息,回调时原样传回 |
| expire | int | 否 | 订单过期秒数,默认 7200 |
| sign | string | 是 | 将参数按 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¬ify_url=http%3A%2F%2Fexample.com%3A3094%2Fpay_callback
返回为 json 格式
| 名称 | 类型 | 必有 | 说明 |
|---|---|---|---|
| status | string | 是 | 只有在 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 同一订单,参数不同 |
| aoid | string | 否 | XorPay 平台统一订单号 |
| expire_in | int | 否 | 订单过期秒数 |
| info | dict | 否 | qr 支付二维码 |
举例:
{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)
https://xorpay.com/api/pay/aid 其中 aid 为用户appid,请在 XorPay 后台 查看
| 名称 | 类型 | 必须 | 说明 |
|---|---|---|---|
| name | string | 是 | 商品名称 |
| pay_type | string | 是 | native |
| price | float | 是 | 价格如: 50.00 |
| order_id | string | 是 | 你平台订单号,需要唯一 |
| order_uid | string | 否 | 订单用户如: abc@def.com |
| notify_url | string | 是 | 回调地址 |
| 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 同一订单,参数不同 |
| aoid | string | 否 | XorPay 平台统一订单号 |
| expire_in | int | 否 | 订单过期秒数 |
| info | dict | 否 | qr 支付二维码 |
举例:
{u'status': u'ok', u'info': {u'qr': u'weixin://wxpay/bizpayurl?pr=jmmfbyN'}, u'expires_in': 7200, u'aoid': u'dfa20e231xf64069a615ecfee0527726'}
https://xorpay.com/api/cashier/aid 其中 aid 为用户appid,请在 XorPay 后台 查看
| 名称 | 类型 | 必须 | 说明 |
|---|---|---|---|
| name | string | 是 | 商品名称 |
| pay_type | string | 是 | jsapi |
| price | float | 是 | 价格如: 50.00 |
| order_id | string | 是 | 你平台订单号,需要唯一 |
| order_uid | string | 否 | 订单用户如: abc@def.com |
| notify_url | string | 是 | 回调地址 |
| return_url | string | 否 | 支付成功后前台跳转地址 |
| cancel_url | string | 否 | 取消支付跳转的地址 |
| more | string | 否 | 订单其他信息,回调时原样传回 |
| expire | int | 否 | 订单过期秒数,默认 7200 |
| sign | string | 是 | 将参数按 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¬ify_url=http%3A%2F%2Fexample.com%3A3094%2Fpay_callback
请求成功无返回内容,如果有返回表示出错。返回为 json 格式
| 名称 | 类型 | 必有 | 说明 |
|---|---|---|---|
| status | string | 否 | 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 同一订单,参数不同 |
https://xorpay.com/api/pay/aid 其中 aid 为用户appid,请在 XorPay 后台 查看
| 名称 | 类型 | 必须 | 说明 |
|---|---|---|---|
| name | string | 是 | 商品名称 |
| pay_type | string | 是 | jsapi |
| price | float | 是 | 价格如: 50.00 |
| order_id | string | 是 | 你平台订单号,需要唯一 |
| order_uid | string | 否 | 订单用户如: abc@def.com |
| notify_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 同一订单,参数不同 |
| aoid | string | 否 | XorPay 平台统一订单号 |
| expire_in | int | 否 | 订单过期秒数 |
| info | dict | 否 | appId jsapi支付参数timeStamp jsapi支付参数nonceStr jsapi支付参数package jsapi支付参数signType jsapi支付参数paySign jsapi支付参数 |
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();
}
https://xorpay.com/api/query/aoid 其中 aoid 为 XorPay 平台订单号
返回为 json 格式
| 名称 | 类型 | 必有 | 说明 |
|---|---|---|---|
| status | string | 是 | not_exist 订单不存在new 订单未支付payed 订单已支付,未通知成功fee_error 手续费扣除失败success 订单已支付,通知成功expire 订单过期 |
你传入的 notify_url 参数
| 名称 | 类型 | 说明 |
|---|---|---|
| aoid | string | XorPay 平台订单唯一标识 |
| order_id | string | 你传入的 order_id 参数 |
| pay_price | float | 例如: 50.00 |
| pay_time | string | 例如: 2019-01-01 00:00:00 |
| more | string | 订单传过来的其他信息 |
| detail | string | json格式,订单支付详细信息transaction_id 渠道流水号bank_type 用户付款方式buyer 消费者 |
| sign | string | 签名, 参数 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 分钟。
https://xorpay.com/api/refund/aoid 其中 aoid 为 XorPay 平台订单号
| 名称 | 类型 | 必须 | 说明 |
|---|---|---|---|
| price | float | 是 | 退款金额如: 50.00 |
| sign | string | 是 | 将参数按 price + app secret 拼接后MD5(纯 value 拼接,不要包含 + 号) |
POST body 举例:
price=0.01&sign=23f86d9bb15x6b11f753547558626d7
返回为 json 格式
| 名称 | 类型 | 必有 | 说明 |
|---|---|---|---|
| status | string | 是 | ok 成功order_error 订单状态不是success/或者订单不存在price_error 退款金额大于收款金额sign_error 签名错误alipay_api_error 支付宝接口错误 |
| info | string | 否 | 具体错误代码 |
注意:
1、本插件是将xorpay支付功能对接入FastAdmin框架,插件可实现快速对接微信/支付宝支付功能,后台插件配置中添加自己在xorpay申请的参数即可使用。
2、xorpay支付并非个人免签约类型靠APP监听收款通知从而实现完成订单的支付方式,微信支付需要签约微信支付微小商户、支付宝需要签约支付宝面对面付款产品,这两款支付产品个人用户即可签约,在xorpay后台可一站式签约。
3、关于插件使用过程中遇到的问题或BUG可以联系插件作者,关于支付接口的申请、接口费率的问题、支付目录设置的问题请联系xorpay官方的客服人员。