🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## **接口内容列表** 说明:所有的支付接口都需要开能微信支付后才能使用 **特别要求**:在使用`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{ // 接口成功的处理 } ~~~