php實現銀聯商務公衆號+服務窗支付

以前咱們學習了銀聯商務的H5支付,可是如今H5支付不支持微信支付,最後發現銀聯商務的公衆號+服務窗支付能夠支持支付寶支付+微信支付+銀聯支付web

一:接口地址:json

測試接口地址:https://qr-test2.chinaums.com...api

正式接口地址:https://qr.chinaums.com/netpa...瀏覽器

二:主要參數說明:微信

接口使用的是get傳參,直接將接口參數放到接口地址後,此接口是由瀏覽器直接跳轉到接口app

1:instMidjsp

業務類型,直接填入:YUEDANDEFAULTpost

2:merOrderId學習

商戶訂單號測試

3:mid

銀聯商務的公衆號+服務窗支付產品的商戶號

4:msgSrc

消息來源,如:WWW.TEST.COM

5:msgType(這個參數是否重要,主要區分使用什麼進行支付)

消息類型:微信支付使用:WXPay.jsPay,支付寶支付使用:trade.jsPay,銀聯支付使用:qmf.jspay或qmf.webPay

6:orderDesc

訂單描述

7:requestTimestamp

報文請求時間,格式爲:yyyy-MM-dd HH:mm:ss,如2019-10-01 12:12:12

8:tid

銀聯商務的公衆號+服務窗支付產品的終端號

9:totalAmount

支付總金額,單位爲分

10:notifyUrl

支付結果通知地址

11:returnUrl

網頁跳轉地址

12:sign

簽名,將上面的參數按照a-z的順序進行排序,排序完成以後用&字符鏈接起來,鏈接起來以後若是存在轉義字符,那麼去掉轉義字符,而後進行md5加密獲取到簽名

三:銀聯商務的公衆號+服務窗支付實例:

//測試號相關信息
$mdKey = 'fcAmtnx7MwismjWNhNKdHC44mNXtnEQeJkRrhKJwyrW2ysRR';
$mid = '898340149000005';
$tid = '88880001';
$time = time();
$requestTimestamp = date('Y-m-d H:i:s',$time);
$merOrderId = date('YmdHis') . mt_rand(100000, 999999);
$msgType = 'qmf.jspay';//微信支付:WXPay.jsPay,支付寶支付:trade.jsPay,銀聯支付:qmf.jspay(qmf.webPay)
$data = [
    'instMid' => 'YUEDANDEFAULT',//業務類型
    'merOrderId' => $merOrderId,//訂單號
    'mid' => $mid,//商戶號
    'msgSrc' => 'WWW.TEST.COM',//消息來源
    'msgType' => $msgType,//消息類型
    'orderDesc' => '測試',//訂單描述
    'requestTimestamp' => $requestTimestamp,//報文請求時間
    'tid' => $tid,//終端號
    'totalAmount' => '1',//支付金額
    'notifyUrl' => 'http://d9vhs4.natappfree.cc',//支付結果通知地址,結果頁面會將返回參數經過post傳過來。經過status值來判斷是否支付成功
    'returnUrl' => 'http://d9vhs4.natappfree.cc',//網頁跳轉地址,結果頁面會將返回參數經過get傳過來。經過status值來判斷是否支付成功
];
ksort($data);
reset($data);
$options = '';
foreach ($data as $key => $value) {
    $options .= $key . '=' . $value .'&';
}
$options = rtrim($options, '&');
//存在轉義字符,那麼去掉轉義
if(get_magic_quotes_gpc()){
    $options = stripslashes($options);
}
$sign = md5($options . $mdKey);
$options .= '&sign=' . $sign;
$url = 'https://qr-test2.chinaums.com/netpay-portal/webpay/pay.do?'.$options;
//獲取到url以後直接跳轉便可

支付結束後返回的status參數取值:

image.png

四:支付退款

既然有支付那麼就有退款,那麼如何進行退款呢

1:退款接口

測試接口:https://qr-test2.chinaums.com...

正式接口:https://qr.chinaums.com/netpa...

2:主要參數說明

(1)msgSrc

消息來源,例:WWW.TEST.COM

(2)msgType

消息來源,直接填入:refund

(3)requestTimestamp

報文請求時間,格式爲yyyy-MM-dd HH:mm:ss,如:2019-10-01 12:12:12

(4)merOrderId

商戶訂單號

(5)instMid

業務類型,直接填入YUEDANDEFAULT

(6)mid

銀聯商務的公衆號+服務窗支付產品的商戶號

(7)tid

銀聯商務的公衆號+服務窗支付產品的終端號

(8)refundAmount

退款金額,單位爲分

(9)refundDesc

退款說明

(10)sign

簽名

實現方式同支付中籤名相同

五:支付退款實例

//測試號相關信息
$mdKey = 'fcAmtnx7MwismjWNhNKdHC44mNXtnEQeJkRrhKJwyrW2ysRR';
$mid = '898340149000005';
$tid = '88880001';
$requestTimestamp = date('Y-m-d H:i:s',time());
$data = [
    'msgSrc' => 'WWW.TEST.COM',//消息來源
    'msgType' => 'refund',//消息類型
    'requestTimestamp' => $requestTimestamp,//報文請求時間
    'merOrderId' => $merOrderId,//訂單號
    'instMid' => $params['instMid'],//業務類型
    'mid' => $mid,//商戶號
    'tid' => $tid,//終端號
    'refundAmount' => 1,//退款金額
    'refundDesc' => '測試',//退款說明
];
ksort($data);
reset($data);
$options = '';
foreach ($data as $key => $value) {
    $options .= $key . '=' . $value .'&';
}
$options = rtrim($options, '&');
//存在轉義字符,那麼去掉轉義
if(get_magic_quotes_gpc()){
    $options = stripslashes($options);
}
//簽名
$sign = md5($options . $mdKey);
$data['sign'] = $sign;
$client = new Client();
$response = $client->createRequest()
    ->setMethod('POST')
    ->setUrl('https://qr-test2.chinaums.com/netpay-route-server/api/')
    ->setData($data)
    ->setHeaders([
        'Content-Type'=>'application/json'
    ])
    ->setFormat(Client::FORMAT_JSON) //提交的數據的格式
    ->send();
if ($response->isOk) {
    $data = $response->data;
    if ($data['refundStatus'] == 'SUCCESS') {
        //退款成功
        return true;
    }
}
return false;
}
相關文章
相關標籤/搜索