你可以在此随机支付一笔一元以下的金额进行体验
请选择对应的支付方式
前往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 顺序拼接后 MD5
if ($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) {
}
//注意只能输出一个success
echo "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官方的客服人员。