发起支付请求 POST
路径 : /api/payment
收银台模式使用Form表单提交,Json返回使用Curl提交
除收银台模式外 请不要携带“return_url”参数
“type”填写cashier时对应微信收银台 支付宝收银台填写alipay并携带“return_url”
请求参数:
键名 | 必填 | 说明 |
---|---|---|
appid | 是 | APPID |
name | 是 | 商品名称 |
type | 是 | 支付方式:
native - 微信扫码 jsapi - 微信JSAPI cashier - 微信收银台 alipay - 支付宝 |
money | 是 | 支付金额 单位:元 |
out_trade_no | 是 | 商户订单号 10位数以上英文/数字 |
notify_url | 是 | 异步通知地址 |
return_url | 否 | 同步跳转地址 收银台则必填 |
mchid | 是 | 平台入驻后显示的MCHID |
openid | 否 | 微信用户标识 JSAPI则必填
获取请见“获取OPENID”栏 |
sign | 是 | MD5签名 |
使用 哆啦宝 的说明:
因公众号原因,jsapi不会返回packge 同native返回一个code_url
微信内直接跳转到code_url即可 浏览器则转换成二维码(收银台不影响)
Json响应参数:
键名 | 类型 | 说明 |
---|---|---|
code | Int | 布尔值 状态码 1 为成功 其他为失败 |
msg | String | 错误描述内容 |
data | Array | [ code_url : 二维码链接, packge : JSAPI支付参数 ] |
回调通知 POST
注意:回调处理完成,请输出大写的 SUCCESS 字符串,如未及时返回,系统将通过策略重新通知5次,通知频率为15s/60s/3m/30m/1h
支付成功后会立即发送回调到notify_url上
“money”参数为Float格式 其他都为String格式
异步POST通知参数:
键名 | 必填 | 说明 |
---|---|---|
appid | 是 | APPID |
mchid | 是 | MCHID |
transaction_id | 是 | 上游订单号(微信/支付宝单号) |
buyer | 是 | 买家标识(微信Openid/支付宝UserId) |
out_trade_no | 是 | 商户订单号 |
trade_no | 是 | 系统订单号 |
money | 是 | 订单支付金额(Float) |
status | 是 | 1 = 已支付 其他均为未支付 |
sign | 是 | MD5签名 |
同步重定向说明(收银台):
收银台支付成功后会重定向到“return_url”,同步跳转只会携带一个商户订单号
例:http://return.url?out_trade_no=商户单号
提交的“return_url”允许携带参数 系统会自动判断
例:http://return.url?key=携带参数&out_trade_no=商户单号
可以调用“查询订单”接口进行二次查询
同步GET重定向参数:
键名 | 类型 | 说明 |
---|---|---|
out_trade_no | String | 商户订单号 |
OpenID获取 GET
路径 : /api/openid
JSAPI需要调用此接口
请求参数:
键名 | 必填 | 说明 |
---|---|---|
appid | 是 | APPID |
redirect_url | 是 | 获取OPENID后的跳转地址 支持携带参数!需要urlencode |
mchid | 是 | mchid |
sign | 是 | MD5签名 |
GET请求该接口,获取 openid 后会带 openid 参数重定向到你提交的 redirect_url
例:
假如提交的redirect_url = https://redirect_url/callback
获取成功后就会重定向到:https:///redirect_url/callback?openid=用户OPENID
携带参数例:
携带参数需要urlencode!
假如提交的redirect_url = https://redirect_url/callback?attch=uid
获取成功后就会重定向到:https://redirect_url/callback?attch=uid&openid=用户OPENID
PHP Demo 示例参考
PHP 获取Openid
<?php $param = [ 'appid'=>'123456', 'mchid'=>'123456', 'redirect_url'=>urlencode('https://api.wyfpay.com') ]; $key = '8BDF48C6519425'; $url = 'https://api.wyfpay.com/api/openid'; ksort($param); $sign = ''; foreach ($param as $k => $v) { $sign.=$k.'='.$v.'&'; } $sign = trim($sign,'&'); $sign = md5($sign.$key); $url = $url.'?appid='.$param['appid'].'&redirect_url='.$param['redirect_url'].'&mchid='.$param['mchid'].'&sign='.$sign; echo $url;
PHP 拉起JsPay案例
<?php
$param = [
'appid'=>'123456',
'name'=>'cs',
'type'=>'jsapi',
'money'=>'0.01',
'out_trade_no'=>'15732093209338',
'notify_url'=>'https://api.wyfpay.com',
'mchid'=>'123456',
'openid'=>'通过Openid接口获取',
];
$key = '8BDF48C65144C7A309425';
$url = 'https://api.wyfpay.com/api/payment';
ksort($param);
$sign = '';
foreach ($param as $k => $v) {
$sign.=$k.'='.$v.'&';
}
$sign = trim($sign,'&');
$param['sign'] = md5($sign.$key);
$row_curl = curl_init();
curl_setopt($row_curl, CURLOPT_URL, $url);
curl_setopt($row_curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($row_curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($row_curl, CURLOPT_CONNECTTIMEOUT , 30);
curl_setopt($row_curl, CURLOPT_TIMEOUT, 30);
curl_setopt($row_curl, CURLOPT_POST, 1);
curl_setopt($row_curl, CURLOPT_POSTFIELDS, $param);
curl_setopt($row_curl, CURLOPT_ENCODING, "gzip");
curl_setopt($row_curl, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($row_curl);
curl_close($row_curl);
$packge = json_decode($data,true)['data']['packge'];
?>
<script>
//调用微信JS api 支付
function jsApiCall()
{
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
<?php echo $packge;?>,
function(res){
console.log('这里可写检测是否支付完成代码')
}
);
}
function callpay()
{
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', jsApiCall);
document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
}
}else{
jsApiCall();
}
}
window.onload = callpay();
</script>
PHP 支付宝(获取支付链接)
<?php
$param = [
'appid'=>'123456',
'name'=>'cs',
'type'=>'alipay',
'money'=>'0.01',
'out_trade_no'=>'123456',
'notify_url'=>'https://api.wyfpay.com',
'mchid'=>'123456',
];
$key = '123456';
$url = 'https://api.wyfpay.com/api/payment';
ksort($param);
$sign = '';
foreach ($param as $k => $v) {
$sign.=$k.'='.$v.'&';
}
$sign = trim($sign,'&');
$param['sign'] = md5($sign.$key);
$row_curl = curl_init();
curl_setopt($row_curl, CURLOPT_URL, $url);
curl_setopt($row_curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($row_curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($row_curl, CURLOPT_CONNECTTIMEOUT , 30);
curl_setopt($row_curl, CURLOPT_TIMEOUT, 30);
curl_setopt($row_curl, CURLOPT_POST, 1);
curl_setopt($row_curl, CURLOPT_POSTFIELDS, $param);
curl_setopt($row_curl, CURLOPT_ENCODING, "gzip");
curl_setopt($row_curl, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($row_curl);
curl_close($row_curl);
$json = json_decode($data,true);
if(isset($json['data']['code_url'])){
echo $json['data']['code_url']; // OK 支付链接
}else{
echo $json['msg']; // 失败 显示错误信息
}
PHP 支付宝(收银台H5)案例 ,微信收银台同理 更改type参数为cashier即可
<?php
$param = [
'appid'=>'123456',
'name'=>'cs',
'type'=>'alipay',
'money'=>'0.01',
'out_trade_no'=>'123456',
'notify_url'=>'https://api.wyfpay.com',
//收银台必须传入return_url参数
'return_url'=>'https://api.wyfpay.com',
'mchid'=>'123456',
];
$key = '123456';
$url = 'https://api.wyfpay.com/api/payment';
ksort($param);
$sign = '';
foreach ($param as $k => $v) {
$sign.=$k.'='.$v.'&';
}
$sign = trim($sign,'&');
$param['sign'] = md5($sign.$key);
?>
<form id='alipaysubmit' name='alipaysubmit' method="post" action="<?php echo $url;?>">
<?php
foreach ($param as $k => $v) {
echo "<input type='hidden' name=\"".$k."\" value=\"".$v."\">";
}
?>
<input type="submit" value="正在发起支付....">
</form>
<script>document.forms['alipaysubmit'].submit();</script>
PHP 回调验签
<?php
$data = $_POST;
$sign = '';
ksort($data);
foreach ($data as $k => $v) {
if($v && $k !== 'sign') $sign .= $k . '=' . $v . '&';
}
$sign = md5(rtrim($sign, '&') . '你的KEY');
if($sign == $data['sign']) {
// 验签成功!可再次挑起查询接口二次验证 省略...
}
快捷发起支付 GET/POST
路径 : /submit.php
快捷发起支付只支持收银台“return_url”必传 (该接口的回调与普通支付接口回调不一致 看下文) 快捷轮训 风控检测仅支持该接口
(Form表单提交)请求参数:
字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
---|---|---|---|---|---|
商户ID | pid | 是 | Int | 1001 | |
支付方式 | type | 是 | String | alipay | alipay:支付宝 wxpay:微信支付 |
商户订单号 | out_trade_no | 是 | String | 20160806151343349 | |
异步通知地址 | notify_url | 是 | String | http://域名/notify_url.php | 服务器异步通知地址 |
跳转通知地址 | return_url | 是 | String | http://域名/return_url.php | 页面跳转通知地址 |
商品名称 | name | 是 | String | 一双小拖鞋 | |
商品金额 | money | 是 | String | 1.00 | |
网站名称 | sitename | 否 | String | 六六六 | |
签名字符串 | sign | 是 | String | 202cb962ac59075b964b07152d234b70 | 签名算法 |
签名类型 | sign_type | 是 | String | MD5 | 默认为MD5 |
快捷支付回调 GET
注意:回调处理完成,请输出大写的 SUCCESS 字符串,如未及时返回,系统将通过策略重新通知5次,通知频率为15s/60s/3m/30m/1h
快捷发起支付只支持收银台“return_url”必传 (该接口的回调与普通支付接口回调不一致 看下文) 快捷轮训 风控检测仅支持该接口
示例:地址?pid={商户ID}&type={支付方式}&out_trade_no={商户订单号}& notify_url={服务器异步通知地址}&return_url={页面跳转通知地址}&name={商品名称}&money={金额}&sitename={网站名称}&sign={签名字符串}&sign_type=MD5
(Form表单提交)请求参数:
字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
---|---|---|---|---|---|
商户ID | pid | 是 | Int | 1001 | |
系统订单号 | trade_no | 是 | String | 20160806151343349021 | 订单号 |
商户订单号 | out_trade_no | 是 | String | 20160806151343349 | 商户系统内部的订单号 |
支付方式 | type | 是 | String | alipay | alipay:支付宝 wxpay:微信支付 |
商品名称 | name | 是 | String | 小双小拖鞋 | |
商品金额 | money | 是 | String | 1.00 | |
支付状态 | trade_status | 是 | String | TRADE_SUCCESS | |
签名字符串 | sign | 是 | String | 202cb962ac59075b964b07152d234b70 | 与发起支付相同 |
签名类型 | sign_type | 是 | String | MD5 | 默认为MD5 |