微信小程序退款 處理類


<?php
/**
 * 微信小程序退款 處理類
參考
https://www.cnblogs.com/afei-qwerty/p/7922982.html *
*/ class WeixinRefundModel extends Model { protected $SSLCERT_PATH = './apiclient_cert.pem';//證書路徑 protected $SSLKEY_PATH = './apiclient_key.pem';//證書路徑 // function __construct($openid,$outTradeNo,$totalFee,$outRefundNo,$refundFee){ // //初始化退款類需要的變量 // $this->openid = $openid; // $this->outTradeNo = $outTradeNo; // $this->totalFee = $totalFee; // $this->outRefundNo = $outRefundNo; // $this->refundFee = $refundFee; // } /* * array(9) { ["return_code"] => string(7) "SUCCESS" ["return_msg"] => string(2) "OK" ["appid"] => string(18) "****************" ["mch_id"] => string(10) "8888888" ["nonce_str"] => string(16) "V5BUsFl4ikNVwfWz" ["sign"] => string(32) "4DD91513B5CDA88C43B9D91DE6CE0C2B" ["result_code"] => string(4) "FAIL" ["err_code"] => string(13) "ORDERNOTEXIST" ["err_code_des"] => string(15) "訂單不存在" } * * * array(18) { ["return_code"] => string(7) "SUCCESS" ["return_msg"] => string(2) "OK" ["appid"] => string(18) "***************" ["mch_id"] => string(10) "****************" ["nonce_str"] => string(16) "hYCjvz62vDdPfh3q" ["sign"] => string(32) "438E05D357B9090EBA0ED1A11A046B71" ["result_code"] => string(7) "SUCCESS" ["transaction_id"] => string(28) "4200000288201901186053870346" ["out_trade_no"] => string(15) "qs2878042616316" ["out_refund_no"] => string(15) "ceshi1547811669" ["refund_id"] => string(29) "**************************" ["refund_channel"] => array(0) {} ["refund_fee"] => string(1) "1" ["coupon_refund_fee"] => string(1) "0" ["total_fee"] => string(1) "1" ["cash_fee"] => string(1) "1" ["coupon_refund_count"] => string(1) "0" ["cash_refund_fee"] => string(1) "1" } * * */ //通過微信api進行退款流程 public function wxrefundapi($out_trade_no,$total_fee,$refund_fee){ $parma = array( 'appid' => C('APPID'), 'mch_id' => C('MCHID'), 'nonce_str' => $this->createNoncestr(), 'out_refund_no' => $out_trade_no.rand('1111,9999'), //由后端生成的退款單號,需要保證唯一,因為多個同樣的退款單號只會退款一次。 'out_trade_no' => $out_trade_no, //退款訂單在支付時生成的訂單號 'total_fee' => $total_fee, 'refund_fee' => $refund_fee, 'op_user_id' => C('MCHID'), //操作員 op_user_id .與商戶號相同即可 ); $parma['sign'] = $this->getSign($parma); $xmldata = $this->arrayToXml($parma); $xmlresult = $this->postXmlSSLCurl($xmldata,'https://api.mch.weixin.qq.com/secapi/pay/refund'); $result = $this->xmlToArray($xmlresult); setlog($parma,$result,__METHOD__); if (!$result){ $result_arr = [ 'num' => '0', 'desc' => '接口錯誤', ]; return $result_arr; } if ($result['result_code'] != 'SUCCESS'){ $result_arr = [ 'num' => '-1', 'desc' => $result['err_code_des'] ]; } else { $result_arr = [ 'num' => '1', 'desc' => '退款成功', 'data' => $result['refund_id'] ]; } return $result_arr; } /* * 生成隨機字符串方法 */ protected function createNoncestr($length = 32 ){ $chars = "abcdefghijklmnopqrstuvwxyz0123456789"; $str =""; for ( $i = 0; $i < $length; $i++ ) { $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1); } return $str; } /* * 對要發送到微信統一下單接口的數據進行簽名 */ protected function getSign($Obj){ foreach ($Obj as $k => $v){ $Parameters[$k] = $v; } //簽名步驟一:按字典序排序參數 ksort($Parameters); $String = $this->formatBizQueryParaMap($Parameters, false); //簽名步驟二:在string后加入KEY $String = $String."&key=".C('WEIXIN_PAY_KEY'); //簽名步驟三:MD5加密 $String = md5($String); //簽名步驟四:所有字符轉為大寫 $result_ = strtoupper($String); return $result_; } /* *排序並格式化參數方法,簽名時需要使用 */ protected function formatBizQueryParaMap($paraMap, $urlencode) { $buff = ""; ksort($paraMap); foreach ($paraMap as $k => $v) { if($urlencode) { $v = urlencode($v); } //$buff .= strtolower($k) . "=" . $v . "&"; $buff .= $k . "=" . $v . "&"; } $reqPar = ''; if (strlen($buff) > 0) { $reqPar = substr($buff, 0, strlen($buff)-1); } return $reqPar; } //數組轉字符串方法 protected function arrayToXml($arr){ $xml = "<xml>"; foreach ($arr as $key=>$val) { if (is_numeric($val)){ $xml.="<".$key.">".$val."</".$key.">"; }else{ $xml.="<".$key."><![CDATA[".$val."]]></".$key.">"; } } $xml.="</xml>"; return $xml; } protected function xmlToArray($xml){ $array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $array_data; } //需要使用證書的請求 function postXmlSSLCurl($xml,$url,$second=30) { $ch = curl_init(); //超時時間 curl_setopt($ch, CURLOPT_TIMEOUT, $second); //這里設置代理,如果有的話 //curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8'); //curl_setopt($ch,CURLOPT_PROXYPORT, 8080); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //設置header curl_setopt($ch, CURLOPT_HEADER, FALSE); //要求結果為字符串且輸出到屏幕上 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //設置證書 //使用證書:cert 與 key 分別屬於兩個.pem文件 //默認格式為PEM,可以注釋 curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM'); curl_setopt($ch, CURLOPT_SSLCERT, $this->SSLCERT_PATH); //默認格式為PEM,可以注釋 curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM'); curl_setopt($ch, CURLOPT_SSLKEY, $this->SSLKEY_PATH); //post提交方式 curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); $data = curl_exec($ch); //返回結果 if ($data) { curl_close($ch); return $data; } else { $error = curl_errno($ch); echo "curl出錯,錯誤碼:$error" . "<br>"; curl_close($ch); return false; } } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM