## **接口内容列表**
说明:所有的支付接口都需要开能微信支付后才能使用
**特别要求**:在使用`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.kancloud.cn/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{
// 接口成功的处理
}
~~~