이번에는 WeChat 결제 및 환불을 구현하기 위한 PHP를 가져오겠습니다. PHP를 사용하여 WeChat 결제 및 환불을 구현하는 데 있어 주의 사항은 무엇입니까? 다음은 실제 사례입니다.
저는 이전에 WeChat 결제 및 환불에 관해 여러 기사를 작성했습니다.
1. PHP는 WeChat 결제(jsapi 결제) 프로세스를 구현합니다.
2. ThinkPHP는 WeChat 결제(jsapi 결제) 프로세스를 구현합니다.
3. PHP는 WeChat 환불 애플리케이션을 구현합니다. 기사는 모두 WeChat에서 공식적으로 제공하는 SDK의 PHP 버전을 사용합니다. 코드를 작성하면 결제 시 많은 시간을 절약할 수 있고 단계도 상당히 단순해집니다. 그러나 SDK를 통합하는 데에는 많은 함정이 있다고 말합니다. SDK가 너무 오래되서 오류가 보고되거나, 정식 SDK 자체에 오류가 많아 수정하기가 매우 번거롭고, 결제시에도 정말 걸리기 쉽기 때문에 오늘은 제가 알려드리겠습니다. 결제 SDK를 통합하지 않고 결제 인터페이스를 직접 호출하여 결제 및 결제를 구현하는 방법에 대해 이야기합니다.
준비: 1. 물론 WeChat 인증 서비스 계정이 있어야 하며 WeChat 결제를 활성화해야 합니다.
2. WeChat 판매자 백엔드에서 결제 승인 디렉터리를 구성하고 결제를 준비하세요. 인증서(결제에 사용되지 않음, 환불 시 사용)
3. 결제를 위해 인터페이스를 호출할 경우 먼저 사용자의 openid를 알아야 하므로, 이 역시 먼저 사용자의 openid를 얻는 방법을 알아야 합니다. 매우 간단합니다. 이전에 이 기사에서 사용자의 openid를 얻는 방법에 대해 설명했습니다. 자세한 내용은 사용자의 openid를 얻는 WeChat 공개 계정 기사를 참조하세요.
자, 더 이상 고민하지 말고 메인 코드를 붙여넣기만 하면 됩니다:
/** * 微信支付请求接口(POST) * @param string $openid openid * @param string $body 商品简单描述 * @param string $order_sn 订单编号 * @param string $total_fee 金额 * @return json的数据 */ public function wxpay($openid,$total_fee,$body,$order_sn){ $config = $this->config; //统一下单参数构造 $unifiedorder = array( 'appid' => $config['appid'], 'mch_id' => $config['mch_id'], 'nonce_str' => self::getNonceStr(), 'body' => $body, 'out_trade_no' => $order_sn, 'total_fee' => $total_fee * 100, 'spbill_create_ip' => self::getip(), 'notify_url' => 'http://'.$_SERVER['HTTP_HOST'].'/notify.php', 'trade_type' => 'JSAPI', 'openid' => $openid ); $unifiedorder['sign'] = self::makeSign($unifiedorder); //return $unifiedorder; //请求数据,统一下单 $xmldata = self::array2xml($unifiedorder); $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; $res = self::curl_post_ssl($url, $xmldata); if(!$res){ return array('status'=>0, 'msg'=>"Can't connect the server" ); } // 这句file_put_contents是用来查看服务器返回的结果 测试完可以删除了 //file_put_contents('./log.txt',$res,FILE_APPEND); $content = self::xml2array($res); if(strval($content['result_code']) == 'FAIL'){ return array('status'=>0, 'msg'=>strval($content['err_code']).':'.strval($content['err_code_des'])); } if(strval($content['return_code']) == 'FAIL'){ return array('status'=>0, 'msg'=>strval($content['return_msg'])); } $time = time(); settype($time, "string"); //jsapi支付界面,时间戳必须为字符串格式 $resdata = array( 'appId' => strval($content['appid']), 'nonceStr' => strval($content['nonce_str']), 'package' => 'prepay_id='.strval($content['prepay_id']), 'signType' => 'MD5', 'timeStamp' => $time ); $resdata['paySign'] = self::makeSign($resdata); return json_encode($resdata); } /** * 微信退款(POST) * @param string(28) $transaction_id 在微信支付的时候,微信服务器生成的订单流水号,在支付通知中有返回 * @param string $out_refund_no 商品简单描述 * @param string $total_fee 微信支付的时候支付的总金额(单位:分) * @param string $refund_fee 此次要退款金额(单位:分) * @return string xml格式的数据 */ public function refund($transaction_id,$out_refund_no,$total_fee,$refund_fee){ $config = $this->config; //退款参数 $refundorder = array( 'appid' => $config['appid'], 'mch_id' => $config['mch_id'], 'nonce_str' => self::getNonceStr(), 'transaction_id'=> $transaction_id, 'out_refund_no' => $out_refund_no, 'total_fee' => $total_fee * 100, 'refund_fee' => $refund_fee * 100 ); $refundorder['sign'] = self::makeSign($refundorder); //请求数据,进行退款 $xmldata = self::array2xml($refundorder); $url = 'https://api.mch.weixin.qq.com/secapi/pay/refund'; $res = self::curl_post_ssl($url, $xmldata); if(!$res){ return array('status'=>0, 'msg'=>"Can't connect the server" ); } // 这句file_put_contents是用来查看服务器返回的结果 测试完可以删除了 //file_put_contents('./log3.txt',$res,FILE_APPEND); $content = self::xml2array($res); if(strval($content['result_code']) == 'FAIL'){ return array('status'=>0, 'msg'=>strval($content['err_code']).':'.strval($content['err_code_des'])); } if(strval($content['return_code']) == 'FAIL'){ return array('status'=>0, 'msg'=>strval($content['return_msg'])); } return $content; }
이것은 캡슐화된 클래스이고 사용이 매우 간단합니다:
<?php require_once "wxpay.class.php"; $config = array( 'wxappid' => 'wx123456789876', 'mch_id' => '123456789', 'pay_apikey' => '123456789876123456789876123456789876' ); $wxpay = new WxPay($config); $result = $wxpay->paytest(); ?> <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>江南极客支付</title> <script type="text/javascript"> //调用微信JS api 支付 function jsApiCall() { WeixinJSBridge.invoke( 'getBrandWCPayRequest',<?php echo $result; ?>, function(res){ WeixinJSBridge.log(res.err_msg); //alert(res); if(res.err_msg == "get_brand_wcpay_request:ok"){ alert("支付成功!"); }else if(res.err_msg == "get_brand_wcpay_request:cancel"){ alert("用户取消支付!"); }else{ alert("支付失败!"); } } ); } 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(); } } </script> </head> <body> <br/> <font color="#9ACD32"><b>该笔订单支付金额为<span style="color:#f00;font-size:50px">1分</span>钱</b></font><br/><br/> <font color="#9ACD32"><b><span style="color:#f00;font-size:50px;margin-left:40%;">1分</span>钱也是爱</b></font><br/><br/> <p align="center"> <button style="width:210px; height:50px; border-radius: 15px;background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:16px;" type="button" onclick="callpay()" >果断买买买^_^</button> </p> </body> </html>
결제 콜백 확인에 관해서는 여기에서 너무 자세히 설명하지 않겠습니다. 이해가 안 되시는 분들을 위해 ThinkPHP에서 WeChat 결제(jsapi 결제)를 구현하는 과정을 보실 수 있습니다. 여기서는 콜백 처리 방법을 자세히 설명합니다.
이 기사의 사례를 읽은 후 방법을 마스터했다고 생각합니다. 더 흥미로운 정보를 보려면 PHP 중국어 웹사이트의 다른 관련 기사를 주목하세요!
추천 자료:
프런트 엔드 인터페이스에서 비밀번호를 얻기 위해 AngularJS 사용하기fullpage.js 스크롤 방법JS 명령 모드 개념 및 사용 분석위 내용은 PHP는 WeChat 결제 및 환불을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!