## **接口內容列表**
說明:所有的支付接口都需要開能微信支付后才能使用
**特別要求**:在使用`JSAPI`支付時,必需傳入`JSSDK`配置參數`wx.config()`,見上一個章節。
[TOC]
## **微信支付步驟**
* 一、根據商戶訂單號生成預支付碼(區分支付類型)
* 二、根據支付類型來處理預支付碼
> JSAPI支付,需要創建JS簽名包,然后在微信網頁上發起支付
> 掃碼支付,直接將預支付碼生成二維碼就可以了
* 三、在生成預支付碼時,需要指定接收支付通知URL,通常也在通知處理時判斷交易是否已完成
## **生成微信預支付ID(`NATIVE`模式二與`JSAPI`通用)**
參數說明:
* 參數`$openid`為支付者`openid`(`JSAPI`支付必需,`NATIVE`支付時無需填寫,給`NULL`就可以了)
* 參數`$body`為交易訂單標題(注意文字編碼不要出現特殊字符)
* 參數`$out_trade_no`為商戶訂單號(訂單支付成功后不可重復使用)
* 參數`$total_fee`為訂單交易金額,單位為分(如支付`1`元需填寫`100`)
* 參數`$trade_type`指定支付發起類型,常用類型有`JSAPI`(網頁支付)、`NATIVE`(掃碼支付)、`APP`(APP支付)
~~~
// 實例支付接口
$pay = & load_wechat('Pay');
// 獲取預支付ID
$result = $pay->getPrepayId($openid, $body, $out_trade_no, $total_fee, $notify_url, $trade_type = "JSAPI");
// 處理創建結果
if($result===FALSE){
// 接口失敗的處理
return false;
}else{
// 接口成功的處理
}
~~~
## **發起微信掃碼`NATIVE`支付,模式一**
* 第一步生成支付規則二維碼
~~~
// 實例支付接口
$pay = & load_wechat('Pay');
// 獲取二維碼的內容,參數 $product_id 為商戶定義的商品id 或者訂單號
$qrc = $pay->getQrcPayUrl($product_id);
// 用PHP類去生成二維碼(當然也可以用JS去生成),二維碼的內容就是 $result
~~~
* 第二步,接收微信掃碼通知,需要配置公眾平臺`掃碼支付 > 支付回調URL`
~~~
// 實例支付接口
$pay = & load_wechat('Pay');
// 獲取通知的數據
$notify = $pay->getNotify();
// 獲取通知數據結果處理
if ($notify === false) {
echo $pay->errMsg;
} else{
}
~~~
* 其中`Notify`返回的字段如下:
~~~
Array
(
[appid] => wx60a43dd8161666d4
[openid] => o38gps3vNdCqaggFfrBRCRikwlWY
[mch_id] => 1332187001
[is_subscribe] => Y
[nonce_str] => ZcuirbtPMTUuYER9
[product_id] => 8888
[sign] => 3D8B5452E1C3566CA967D0B7C93A5574
)
~~~
* 第三步,根據接收到的數據,創建`qrcPrepayid`
~~~
// @todo,創建訂單并生成訂單號
$order_no = '訂單號';
// 生成支付通知地址,需要帶上完整http及域名
$notify_url = 'http://youdomaon.com/pay/notify.html';
// 創建預支付碼,參數:用戶openid,支付內容,訂單號,支付通知地址
$prepayid = $pay->getQrcPrepayId($notify['openid'], '支付測試', $order_no, 1, $notify_url);
// 失敗的處理
if($prepayid===false){
}
~~~
* 第四步,輸出`xml`結果,微信端將自動發起支付
官方參考:[https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6\_4](https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_4)
~~~
$data = array(
'return_code' => 'SUCCESS',
'return_msg' => '創建支付成功!',
'appid' => $pay->appid,
'mch_id' => $pay->mch_id,
'nonce_str' => \Wechat\Lib\Tools::createNoncestr(),
'prepay_id' => $prepayid,
'result_code' => 'SUCCESS',
'err_code_des' => 'null'
);
$data['sign'] = \Wechat\Lib\Tools::getPaySign($data, $pay->partnerKey);
echo \Wechat\Lib\Tools::arr2xml($data);
~~~
## **發起微信掃碼`NATIVE`支付,模式二**
* 微信掃碼支依賴于`微信預支付ID`,參考上面
* 獲取到`微信預支付ID`后,直接將`微信預支付ID`生成二維碼即可
* 在接收微信支付通知時,再來處理相關訂單的支付狀態
* 參考DEMO:[ThinkPHP 5.0 微信掃碼支付](http://www.hmoore.net/zoujingli/wechat-php-sdk/219111)
~~~
// 實例支付接口
$pay = & load_wechat('Pay');
// 獲取預支付ID
$result = $pay->getPrepayId($openid, $body, $out_trade_no, $total_fee, $notify_url, $trade_type = "NATIVE");
// 處理創建結果
if($result===FALSE){
// 接口失敗的處理
return false;
}else{
// 用PHP類去生成二維碼(當然也可以用JS去生成),二維碼的內容就是 $result
}
~~~
## **發起微信網頁`JSAPI`支付**
* 微信網頁`JSAPI`支付相對微信掃碼`NATIVE`支付要復雜一些,需要生成`JS`簽名包
* 首先生成`微信預支付ID`,參考上面
* 然后將`微信預支付ID`及參數進行簽名并生成`JSSDK`所需要的參數
~~~
// 實例支付接口
$pay = & load_wechat('Pay');
// 創建JSAPI簽名參數包,這里返回的是數組
$options = $pay->createMchPay($prepayid);
~~~
* 拿到`$options`簽名參數包后,附值到前端`JS`中
~~~
// 下面是 javascript 代碼
wx.ready(function () {
// 這里獲取到PHP生成簽名參數包,注意是JSON格式
var options = <{$options|json_encode}>;
// 支付成功后的操作
options.success = function () {
window.location.href = "支付成功后的跳轉地址,通常是訂單列表";
};
// 取消支付的操作
options.cancel = function () {
pay_order = true;
};
// 支付失敗的處理
options.fail = function () {
pay_order = true;
};
// 傳入參數,發起JSAPI支付
wx.chooseWXPay(options);
});
~~~
* 至此,微信支付就只剩下通知處理了,根據通知更新相關訂單的支付狀態
## **通過 支付通知回調 處理訂單狀態**
~~~
// 實例支付接口
$pay = & load_wechat('Pay');
// 獲取支付通知
$notifyInfo = $pay->getNotify();
// 支付通知數據獲取失敗
if($notifyInfo===FALSE){
// 接口失敗的處理
echo $pay->errMsg;
}else{
//支付通知數據獲取成功
if ($notifyInfo['result_code'] == 'SUCCESS' && $notifyInfo['return_code'] == 'SUCCESS') {
// 支付狀態完全成功,可以更新訂單的支付狀態了
// @todo
// 返回XML狀態,至于XML數據可以自己生成,成功狀態是必需要返回的。
// <xml>
// return_code><![CDATA[SUCCESS]]></return_code>
// return_msg><![CDATA[OK]]></return_msg>
// </xml>
return xml(['return_code' => 'SUCCESS', 'return_msg' => 'DEAL WITH SUCCESS'])
}
}
~~~
其中`$notifyInfo`的數據內容為:
~~~
array (
'appid' => 'wx3581ccf368729be3',
'bank_type' => 'CFT',
'cash_fee' => '1',
'fee_type' => 'CNY',
'is_subscribe' => 'Y',
'mch_id' => '1307539701',
'nonce_str' => 'api268huedasmkfgdjofzwitpuaqjl0c',
'openid' => 'o9j5kw-B8ZCp_FWLBmnSkrr1qHRE',
'out_trade_no' => '959947360',
'result_code' => 'SUCCESS',
'return_code' => 'SUCCESS',
'sign' => '43C91961D389D0A9FC480BC5B13592E6',
'time_end' => '20161011103317',
'total_fee' => '1',
'trade_type' => 'NATIVE',
'transaction_id' => '4008082001201610116370274372',
)
~~~
## **微信支付訂單關閉操作**
* 參數`$out_trade_no`為商戶訂單號(創建`預支付ID`時傳入的`$out_no`)
~~~
// 實例支付接口
$pay = & load_wechat('Pay');
// 調用查詢接口
$result = $pay->closeOrder($out_trade_no);
// 處理查詢結果
if($result===FALSE){
// 接口失敗的處理
echo $pay->errMsg;
}else{
// 接口成功的處理
}
~~~
## **微信支付訂單操作退款**
* 參數`$out_trade_no`為商戶訂單號(創建`預支付ID`時傳入的`$out_no`)
* 參數`$transaction_id`為微信內部訂單號(微信支付通知里有,所有在那里需要記錄下來)
* 參數`$out_refund_no`為商戶退款訂單號(需要重新生成一個退款訂單號,不能重復的)
* 參數`$total_fee`為訂單交易總金額(單位為分,如1元填寫100)
* 參數`$refund_fee`為需要退款的金額(單位為分,如1元填寫100,其金額不能大于交易總金額)
* 參數`$op_user_id`為操作員ID,默認為商戶ID(可不填寫)
* **注意:退款操作,是需要配置交易證書`cert.zip`,可以微信商戶平臺下載**
~~~
// 實例支付接口
$pay = & load_wechat('Pay');
// 調用退款接口
$result = $pay->refund($out_trade_no, $transaction_id, $out_refund_no, $total_fee, $refund_fee, $op_user_id = null);
// 處理創建結果
if($result===FALSE){
// 接口失敗的處理
echo $pay->errMsg;
}else{
// 接口成功的處理
}
~~~
## **微信支付訂單詳情查詢**
* 參數`$out_trade_no`為商戶訂單號(創建`預支付ID`時傳入的`$out_no`)
~~~
// 實例支付接口
$pay = & load_wechat('Pay');
// 調用查詢接口
$result = $pay->queryOrder($out_trade_no);
// 處理查詢結果
if($result===FALSE){
// 接口失敗的處理
echo $pay->errMsg;
}else{
// 接口成功的處理
}
~~~
## **微信支付訂單操作退款狀態查詢**
* 參數`$out_trade_no`為商戶訂單號(創建`預支付ID`時傳入的`$out_no`)
~~~
// 實例支付接口
$pay = & load_wechat('Pay');
// 調用查詢接口
$result = $pay->refundQuery($out_trade_no);
// 處理查詢結果
if($result===FALSE){
// 接口失敗的處理
echo $pay->errMsg;
}else{
// 接口成功的處理
}
~~~
## **獲取微信支付對賬單**
參數`$bill_date`為對賬日期(格式:20140603)
參數`$bill_type`為賬單類型,可以不填寫,默認值 ALL。可選 ALL(返回當日所有訂單信息)、SUCCESS(返回當日成功支付的訂單)、REFUND(返回當日退款訂單)
~~~
// 實例支付接口
$pay = & load_wechat('Pay');
// 獲取對賬單
$result = $pay->getBill($bill_date, $bill_type);
// 處理結果
if($result===FALSE){
// 接口失敗的處理
echo $pay->errMsg;
}else{
// 接口成功的處理
}
~~~
## **微信公眾號給粉絲發送現金紅包**
* 參數`$openid`為紅包接收者Openid
* 參數`$amount`為紅包金額(如1元填寫100,最少不能少于1元)
* 參數`$billno`為商戶訂單號(需要自己生成,不能重復使用)
* 參數`$sendname`為商戶名稱(紅包上會顯示的哦)
* 參數`$wishing`為紅包的祝福語(紅包上會顯示的哦)
* 參數`$actname`為活動名稱
* 參數`$remark`為活動紅包備注信息
* **注意:發送現金紅包,是需要配置交易證書`cert.zip`,可以微信商戶平臺下載**
~~~
// 實例支付接口
$pay = & load_wechat('Pay');
// 調用方法
$result = $pay->sendRedPack($openid, $amount, $billno, $sendname, $wishing, $actname, $remark);
// 處理結果
if($result === FALSE){
// 返回失敗的處理結果
echo $pay->errMsg;
}else{
// 返回成功的處理結果
}
~~~
## **微信現金紅包狀態查詢**
* 參數`$billno`為商戶訂單號(發送紅包時傳入的`$billno`)
~~~
// 實例支付接口
$pay = & load_wechat('Pay');
// 調用查詢接口
$result = $pay->queryRedPack($billno);
// 處理查詢結果
if($result===FALSE){
// 接口失敗的處理
echo $pay->errMsg;
}else{
// 接口成功的處理
}
~~~
## **微信公眾號使用企業打款給個人**
* 參數`$openid`為款項接收者Openid
* 參數`$amount`為款項金額(如1元填寫100,最少不能少于1元)
* 參數`$billno`為商戶訂單號(需要自己生成,不能重復使用)
* 參數`$desc`為活動紅包備注信息(支付信息上會顯示的哦)
* **注意:企業打款給個人,是需要配置交易證書`cert.zip`,可以微信商戶平臺下載**
~~~
// 實例化支付接口
$pay = & load_wechat('Pay');
// 調用方法
$result = $pay->transfers($openid,$amount,$billno, $desc);
// 處理結果
if($result === FALSE){
// 返回失敗的處理結果
echo $pay->errMsg;
}else{
// 返回成功的處理結果
}
~~~
## **微信企業打款狀態查詢**
* 參數`$billno`為商戶訂單號(企業打款時傳入的`$billno`)
~~~
// 實例支付接口
$pay = & load_wechat('Pay');
// 調用查詢接口
$result = $pay->queryTransfers($billno);
// 處理查詢結果
if($result===FALSE){
// 接口失敗的處理
echo $pay->errMsg;
}else{
// 接口成功的處理
}
~~~