WeChat web client generates payment QR code
Oct 15, 2016 am 10:31 AMAuthorized to obtain QR code category:
<?<span style="color: #000000;">php </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * Trade類 * @author xyyphp * @date 2016/10/10 </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">abstract</span> <span style="color: #0000ff;">class</span> TradeController <span style="color: #0000ff;">extends</span><span style="color: #000000;"> BaseController { </span><span style="color: #0000ff;">protected</span> <span style="color: #800080;">$mchid</span><span style="color: #000000;">; </span><span style="color: #0000ff;">protected</span> <span style="color: #800080;">$appid</span><span style="color: #000000;">; </span><span style="color: #0000ff;">protected</span> <span style="color: #800080;">$key</span><span style="color: #000000;">; </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> init() { parent</span>::<span style="color: #000000;">init(); </span><span style="color: #800080;">$this</span>->mchid = WX_MCHID; <span style="color: #008000;">//</span><span style="color: #008000;"> 微信支付商戶號 PartnerID 通過微信支付商戶資料審核后郵件發(fā)送</span> <span style="color: #800080;">$this</span>->appid = WX_APPID; <span style="color: #008000;">//</span><span style="color: #008000;">公眾號APPID 通過微信支付商戶資料審核后郵件發(fā)送</span> <span style="color: #800080;">$this</span>-><span style="color: #008080;">key</span> = WX_APIKEY; <span style="color: #008000;">//</span><span style="color: #008000;">https://pay.weixin.qq.com 帳戶設(shè)置-安全設(shè)置-API安全-API密鑰-設(shè)置API密鑰</span> <span style="color: #000000;"> } </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * @param string $openid 調(diào)用【網(wǎng)頁授權(quán)獲取用戶信息】接口獲取到用戶在該公眾號下的Openid * @param float $totalFee 收款總費用 單位元 * @param string $outTradeNo 唯一的訂單號 * @param string $orderName 訂單名稱 * @param string $notifyUrl 支付結(jié)果通知url 不要有問號 * https://mp.weixin.qq.com/ 微信支付-開發(fā)配置-測試目錄 * 測試目錄 http://mp.izhanlue.com/paytest/ 最后需要斜線,(需要精確到二級或三級目錄) * @return string </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> createJsBizPackage(<span style="color: #800080;">$totalFee</span>, <span style="color: #800080;">$outTradeNo</span>, <span style="color: #800080;">$orderName</span>, <span style="color: #800080;">$notifyUrl</span>, <span style="color: #800080;">$timestamp</span><span style="color: #000000;">) { </span><span style="color: #800080;">$config</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">( </span>'mch_id' => <span style="color: #800080;">$this</span>->mchid, 'appid' => <span style="color: #800080;">$this</span>->appid, 'key' => <span style="color: #800080;">$this</span>-><span style="color: #008080;">key</span>,<span style="color: #000000;"> ); </span><span style="color: #800080;">$unified</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">( </span>'appid' => <span style="color: #800080;">$config</span>['appid'], 'attach' => '支付', <span style="color: #008000;">//</span><span style="color: #008000;">商家數(shù)據(jù)包,原樣返回</span> 'body' => <span style="color: #800080;">$orderName</span>, 'mch_id' => <span style="color: #800080;">$config</span>['mch_id'], 'nonce_str' => <span style="color: #800080;">$this</span>->createNonceStr(), 'notify_url' => <span style="color: #800080;">$notifyUrl</span>, <span style="color: #008000;">//</span><span style="color: #008000;">'openid' => $openid, //rade_type=JSAPI,此參數(shù)必傳</span> 'out_trade_no' => <span style="color: #800080;">$outTradeNo</span>, 'spbill_create_ip' => '127.0.0.1', 'total_fee' => <span style="color: #008080;">intval</span>(<span style="color: #800080;">$totalFee</span> * 100), <span style="color: #008000;">//</span><span style="color: #008000;">單位 轉(zhuǎn)為分</span> 'trade_type' => 'NATIVE',<span style="color: #000000;"> ); </span><span style="color: #800080;">$unified</span>['sign'] = <span style="color: #800080;">$this</span>->getSign(<span style="color: #800080;">$unified</span>, <span style="color: #800080;">$config</span>['key'<span style="color: #000000;">]); </span><span style="color: #800080;">$responseXml</span> = <span style="color: #800080;">$this</span>->curlPost('https://api.mch.weixin.qq.com/pay/unifiedorder', <span style="color: #800080;">$this</span>->arrayToXml(<span style="color: #800080;">$unified</span><span style="color: #000000;">)); </span><span style="color: #008000;">/*</span><span style="color: #008000;"> <xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <appid><![CDATA[wx00e5904efec77699]]></appid> <mch_id><![CDATA[1220647301]]></mch_id> <nonce_str><![CDATA[1LHBROsdmqfXoWQR]]></nonce_str> <sign><![CDATA[ACA7BC8A9164D1FBED06C7DFC13EC839]]></sign> <result_code><![CDATA[SUCCESS]]></result_code> <prepay_id><![CDATA[wx2015032016590503f1bcd9c30421762652]]></prepay_id> <trade_type><![CDATA[JSAPI]]></trade_type> </xml> </span><span style="color: #008000;">*/</span> <span style="color: #800080;">$unifiedOrder</span> = <span style="color: #008080;">simplexml_load_string</span>(<span style="color: #800080;">$responseXml</span>, 'SimpleXMLElement',<span style="color: #000000;"> LIBXML_NOCDATA); </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$unifiedOrder</span> === <span style="color: #0000ff;">false</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">die</span>('parse xml error'<span style="color: #000000;">); } </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$unifiedOrder</span>->return_code != 'SUCCESS'<span style="color: #000000;">) { </span><span style="color: #0000ff;">die</span>(<span style="color: #800080;">$unifiedOrder</span>-><span style="color: #000000;">return_msg); } </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$unifiedOrder</span>->result_code != 'SUCCESS'<span style="color: #000000;">) { </span><span style="color: #0000ff;">die</span>(<span style="color: #800080;">$unifiedOrder</span>-><span style="color: #000000;">err_code); </span><span style="color: #008000;">/*</span><span style="color: #008000;"> NOAUTH 商戶無此接口權(quán)限 NOTENOUGH 余額不足 ORDERPAID 商戶訂單已支付 ORDERCLOSED 訂單已關(guān)閉 SYSTEMERROR 系統(tǒng)錯誤 APPID_NOT_EXIST APPID不存在 MCHID_NOT_EXIST MCHID不存在 APPID_MCHID_NOT_MATCH appid和mch_id不匹配 LACK_PARAMS 缺少參數(shù) OUT_TRADE_NO_USED 商戶訂單號重復 SIGNERROR 簽名錯誤 XML_FORMAT_ERROR XML格式錯誤 REQUIRE_POST_METHOD 請使用post方法 POST_DATA_EMPTY post數(shù)據(jù)為空 NOT_UTF8 編碼格式錯誤 </span><span style="color: #008000;">*/</span><span style="color: #000000;"> } </span><span style="color: #008000;">//</span><span style="color: #008000;">$unifiedOrder->trade_type 交易類型 調(diào)用接口提交的交易類型,取值如下:JSAPI,NATIVE,APP //$unifiedOrder->prepay_id 預支付交易會話標識 微信生成的預支付回話標識,用于后續(xù)接口調(diào)用中使用,該值有效期為2小時 //$unifiedOrder->code_url 二維碼鏈接 trade_type為NATIVE是有返回,可將該參數(shù)值生成二維碼展示出來進行掃碼支付</span> <span style="color: #800080;">$code_list</span> = (<span style="color: #0000ff;">array</span>)<span style="color: #800080;">$unifiedOrder</span>-><span style="color: #000000;">code_url; </span><span style="color: #800080;">$arr</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">( </span>"appId" => <span style="color: #800080;">$config</span>['appid'], "timeStamp" => <span style="color: #800080;">$timestamp</span>, "nonceStr" => <span style="color: #800080;">$this</span>->createNonceStr(), "package" => "prepay_id=" . <span style="color: #800080;">$unifiedOrder</span>->prepay_id, "signType" => 'MD5', "code_url" => <span style="color: #800080;">$code_list</span>[0<span style="color: #000000;">] ); </span><span style="color: #800080;">$arr</span>['paySign'] = <span style="color: #800080;">$this</span>->getSign(<span style="color: #800080;">$arr</span>, <span style="color: #800080;">$config</span>['key'<span style="color: #000000;">]); </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$arr</span><span style="color: #000000;">; } </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * 查詢訂單 </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> orderQuery(<span style="color: #800080;">$outTradeNo</span><span style="color: #000000;">) { </span><span style="color: #800080;">$config</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">( </span>'mch_id' => <span style="color: #800080;">$this</span>->mchid, 'appid' => <span style="color: #800080;">$this</span>->appid, 'key' => <span style="color: #800080;">$this</span>-><span style="color: #008080;">key</span>,<span style="color: #000000;"> ); </span><span style="color: #800080;">$unified</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">( </span>'appid' => <span style="color: #800080;">$config</span>['appid'], 'mch_id' => <span style="color: #800080;">$config</span>['mch_id'], 'out_trade_no' => <span style="color: #800080;">$outTradeNo</span>, 'nonce_str' => <span style="color: #800080;">$this</span>-><span style="color: #000000;">createNonceStr() ); </span><span style="color: #800080;">$unified</span>['sign'] = <span style="color: #800080;">$this</span>->getSign(<span style="color: #800080;">$unified</span>, <span style="color: #800080;">$config</span>['key'<span style="color: #000000;">]); </span><span style="color: #800080;">$responseXml</span> = <span style="color: #800080;">$this</span>->curlPost('https://api.mch.weixin.qq.com/pay/orderquery', <span style="color: #800080;">$this</span>->arrayToXml(<span style="color: #800080;">$unified</span><span style="color: #000000;">)); </span><span style="color: #008000;">/*</span><span style="color: #008000;"> <xml><return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <appid><![CDATA[wx406c5455be1a2590]]></appid> <mch_id><![CDATA[1398638602]]></mch_id> <nonce_str><![CDATA[ousUeAEvH6KlDiGe]]></nonce_str> <sign><![CDATA[D8BFB54A52C324238D5A4BA8C8BC6D01]]></sign> <result_code><![CDATA[SUCCESS]]></result_code> <out_trade_no><![CDATA[1476157452]]></out_trade_no> <trade_state><![CDATA[NOTPAY]]></trade_state> <trade_state_desc><![CDATA[訂單未支付]]></trade_state_desc> </xml> </span><span style="color: #008000;">*/</span> <span style="color: #800080;">$unifiedOrder</span> = <span style="color: #008080;">simplexml_load_string</span>(<span style="color: #800080;">$responseXml</span>, 'SimpleXMLElement',<span style="color: #000000;"> LIBXML_NOCDATA); </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$unifiedOrder</span> === <span style="color: #0000ff;">false</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">die</span>('parse xml error'<span style="color: #000000;">); } </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$unifiedOrder</span>->return_code != 'SUCCESS'<span style="color: #000000;">) { </span><span style="color: #0000ff;">die</span>(<span style="color: #800080;">$unifiedOrder</span>-><span style="color: #000000;">return_msg); } </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$unifiedOrder</span>->result_code != 'SUCCESS'<span style="color: #000000;">) { </span><span style="color: #0000ff;">die</span>(<span style="color: #800080;">$unifiedOrder</span>-><span style="color: #000000;">err_code); </span><span style="color: #008000;">/*</span><span style="color: #008000;"> NOAUTH 商戶無此接口權(quán)限 NOTENOUGH 余額不足 ORDERPAID 商戶訂單已支付 ORDERCLOSED 訂單已關(guān)閉 SYSTEMERROR 系統(tǒng)錯誤 APPID_NOT_EXIST APPID不存在 MCHID_NOT_EXIST MCHID不存在 APPID_MCHID_NOT_MATCH appid和mch_id不匹配 LACK_PARAMS 缺少參數(shù) OUT_TRADE_NO_USED 商戶訂單號重復 SIGNERROR 簽名錯誤 XML_FORMAT_ERROR XML格式錯誤 REQUIRE_POST_METHOD 請使用post方法 POST_DATA_EMPTY post數(shù)據(jù)為空 NOT_UTF8 編碼格式錯誤 </span><span style="color: #008000;">*/</span><span style="color: #000000;"> } </span><span style="color: #008000;">//</span><span style="color: #008000;">$unifiedOrder->trade_type 交易類型 調(diào)用接口提交的交易類型,取值如下:JSAPI,NATIVE,APP //$unifiedOrder->prepay_id 預支付交易會話標識 微信生成的預支付回話標識,用于后續(xù)接口調(diào)用中使用,該值有效期為2小時 //$unifiedOrder->code_url 二維碼鏈接 trade_type為NATIVE是有返回,可將該參數(shù)值生成二維碼展示出來進行掃碼支付</span> <span style="color: #008000;">/*</span><span style="color: #008000;"> public 'return_code' => string 'SUCCESS' (length=7) public 'return_msg' => string 'OK' (length=2) public 'appid' => string 'wx406c5455be1a2590' (length=18) public 'mch_id' => string '1398638602' (length=10) public 'nonce_str' => string 'lyt2ZGFeE9G0DI4W' (length=16) public 'sign' => string 'F942BB644E72FE29936C80E6780D8D8A' (length=32) public 'result_code' => string 'SUCCESS' (length=7) public 'out_trade_no' => string '1476157452' (length=10) public 'trade_state' => string 'NOTPAY' (length=6) public 'trade_state_desc' => string '訂單未支付' (length=15) </span><span style="color: #008000;">*/</span> <span style="color: #008000;">//</span><span style="color: #008000;">已結(jié)支付</span> <span style="color: #008000;">/*</span><span style="color: #008000;"> object(SimpleXMLElement)[26] public 'return_code' => string 'SUCCESS' (length=7) public 'return_msg' => string 'OK' (length=2) public 'appid' => string 'wx406c5455be1a2590' (length=18) public 'mch_id' => string '1398638602' (length=10) public 'nonce_str' => string '6cFpzNc5BTyZ02x0' (length=16) public 'sign' => string 'F01C79BD0FC4BC4FE38231BA92A91201' (length=32) public 'result_code' => string 'SUCCESS' (length=7) public 'openid' => string 'ojIdvuCVrweMrgaU-dFobIItTtpk' (length=28) public 'is_subscribe' => string 'N' (length=1) public 'trade_type' => string 'NATIVE' (length=6) public 'bank_type' => string 'CFT' (length=3) public 'total_fee' => string '1' (length=1) public 'fee_type' => string 'CNY' (length=3) public 'transaction_id' => string '4001652001201610116386495939' (length=28) public 'out_trade_no' => string '1476161468' (length=10) public 'attach' => string '支付' (length=6) public 'time_end' => string '20161011125205' (length=14) public 'trade_state' => string 'SUCCESS' (length=7) public 'cash_fee' => string '1' (length=1) </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$unifiedOrder</span>-><span style="color: #000000;">trade_state_desc)){ </span><span style="color: #800080;">$msg</span> = "訂單未支付"<span style="color: #000000;">; } </span><span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$unifiedOrder</span>-><span style="color: #000000;">transaction_id)){ </span><span style="color: #800080;">$msg</span> = "已支付"<span style="color: #000000;">; } </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$msg</span><span style="color: #000000;">; } </span><span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> notify() { </span><span style="color: #800080;">$config</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">( </span>'mch_id' => <span style="color: #800080;">$this</span>->mchid, 'appid' => <span style="color: #800080;">$this</span>->appid, 'key' => <span style="color: #800080;">$this</span>-><span style="color: #008080;">key</span>,<span style="color: #000000;"> ); </span><span style="color: #800080;">$postStr</span> = <span style="color: #800080;">$GLOBALS</span>["HTTP_RAW_POST_DATA"<span style="color: #000000;">]; </span><span style="color: #008000;">/*</span><span style="color: #008000;"> $postStr = '<xml> <appid><![CDATA[wx00e5904efec77699]]></appid> <attach><![CDATA[支付測試]]></attach> <bank_type><![CDATA[CMB_CREDIT]]></bank_type> <cash_fee><![CDATA[1]]></cash_fee> <fee_type><![CDATA[CNY]]></fee_type> <is_subscribe><![CDATA[Y]]></is_subscribe> <mch_id><![CDATA[1220647301]]></mch_id> <nonce_str><![CDATA[a0tZ41phiHm8zfmO]]></nonce_str> <openid><![CDATA[oU3OCt5O46PumN7IE87WcoYZY9r0]]></openid> <out_trade_no><![CDATA[550bf2990c51f]]></out_trade_no> <result_code><![CDATA[SUCCESS]]></result_code> <return_code><![CDATA[SUCCESS]]></return_code> <sign><![CDATA[F6F519B4DD8DB978040F8C866C1E6250]]></sign> <time_end><![CDATA[20150320181606]]></time_end> <total_fee>1</total_fee> <trade_type><![CDATA[JSAPI]]></trade_type> <transaction_id><![CDATA[1008840847201503200034663980]]></transaction_id> </xml>'; </span><span style="color: #008000;">*/</span> <span style="color: #800080;">$postObj</span> = <span style="color: #008080;">simplexml_load_string</span>(<span style="color: #800080;">$postStr</span>, 'SimpleXMLElement',<span style="color: #000000;"> LIBXML_NOCDATA); </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$postObj</span> === <span style="color: #0000ff;">false</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">die</span>('parse xml error'<span style="color: #000000;">); } </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$postObj</span>->return_code != 'SUCCESS'<span style="color: #000000;">) { </span><span style="color: #0000ff;">die</span>(<span style="color: #800080;">$postObj</span>-><span style="color: #000000;">return_msg); } </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$postObj</span>->result_code != 'SUCCESS'<span style="color: #000000;">) { </span><span style="color: #0000ff;">die</span>(<span style="color: #800080;">$postObj</span>-><span style="color: #000000;">err_code); } </span><span style="color: #800080;">$arr</span> = (<span style="color: #0000ff;">array</span>)<span style="color: #800080;">$postObj</span><span style="color: #000000;">; </span><span style="color: #0000ff;">unset</span>(<span style="color: #800080;">$arr</span>['sign'<span style="color: #000000;">]); </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$this</span>->getSign(<span style="color: #800080;">$arr</span>, <span style="color: #800080;">$config</span>['key']) == <span style="color: #800080;">$postObj</span>-><span style="color: #000000;">sign) { </span><span style="color: #008000;">//</span><span style="color: #008000;"> $mch_id = $postObj->mch_id; //微信支付分配的商戶號 // $appid = $postObj->appid; //微信分配的公眾賬號ID // $openid = $postObj->openid; //用戶在商戶appid下的唯一標識 // $transaction_id = $postObj->transaction_id;//微信支付訂單號 // $out_trade_no = $postObj->out_trade_no;//商戶訂單號 // $total_fee = $postObj->total_fee; //訂單總金額,單位為分 // $is_subscribe = $postObj->is_subscribe; //用戶是否關(guān)注公眾賬號,Y-關(guān)注,N-未關(guān)注,僅在公眾賬號類型支付有效 // $attach = $postObj->attach;//商家數(shù)據(jù)包,原樣返回 // $time_end = $postObj->time_end;//支付完成時間</span> <span style="color: #0000ff;">echo</span> '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>'<span style="color: #000000;">; </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$postObj</span><span style="color: #000000;">; } } </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * curl get * @param string $url * @param array $options * @return mixed </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span> curlGet(<span style="color: #800080;">$url</span> = '', <span style="color: #800080;">$options</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">()) { </span><span style="color: #800080;">$ch</span> = curl_init(<span style="color: #800080;">$url</span><span style="color: #000000;">); curl_setopt(</span><span style="color: #800080;">$ch</span>, CURLOPT_RETURNTRANSFER, 1<span style="color: #000000;">); curl_setopt(</span><span style="color: #800080;">$ch</span>, CURLOPT_TIMEOUT, 30<span style="color: #000000;">); </span><span style="color: #0000ff;">if</span> (!<span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$options</span><span style="color: #000000;">)) { curl_setopt_array(</span><span style="color: #800080;">$ch</span>, <span style="color: #800080;">$options</span><span style="color: #000000;">); } </span><span style="color: #008000;">//</span><span style="color: #008000;">https請求 不驗證證書和host</span> curl_setopt(<span style="color: #800080;">$ch</span>, CURLOPT_SSL_VERIFYPEER, <span style="color: #0000ff;">false</span><span style="color: #000000;">); curl_setopt(</span><span style="color: #800080;">$ch</span>, CURLOPT_SSL_VERIFYHOST, <span style="color: #0000ff;">false</span><span style="color: #000000;">); </span><span style="color: #800080;">$data</span> = curl_exec(<span style="color: #800080;">$ch</span><span style="color: #000000;">); curl_close(</span><span style="color: #800080;">$ch</span><span style="color: #000000;">); </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$data</span><span style="color: #000000;">; } </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * curl post * @param string $url * @param array $options * @return mixed </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span> curlPost(<span style="color: #800080;">$url</span> = '', <span style="color: #800080;">$postData</span> = '', <span style="color: #800080;">$options</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">()) { </span><span style="color: #0000ff;">if</span> (<span style="color: #008080;">is_array</span>(<span style="color: #800080;">$postData</span><span style="color: #000000;">)) { </span><span style="color: #800080;">$postData</span> = <span style="color: #008080;">http_build_query</span>(<span style="color: #800080;">$postData</span><span style="color: #000000;">); } </span><span style="color: #800080;">$ch</span> =<span style="color: #000000;"> curl_init(); curl_setopt(</span><span style="color: #800080;">$ch</span>, CURLOPT_URL, <span style="color: #800080;">$url</span><span style="color: #000000;">); curl_setopt(</span><span style="color: #800080;">$ch</span>, CURLOPT_RETURNTRANSFER, 1<span style="color: #000000;">); curl_setopt(</span><span style="color: #800080;">$ch</span>, CURLOPT_POST, 1<span style="color: #000000;">); curl_setopt(</span><span style="color: #800080;">$ch</span>, CURLOPT_POSTFIELDS, <span style="color: #800080;">$postData</span><span style="color: #000000;">); curl_setopt(</span><span style="color: #800080;">$ch</span>, CURLOPT_TIMEOUT, 30); <span style="color: #008000;">//</span><span style="color: #008000;">設(shè)置cURL允許執(zhí)行的最長秒數(shù)</span> <span style="color: #0000ff;">if</span> (!<span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$options</span><span style="color: #000000;">)) { curl_setopt_array(</span><span style="color: #800080;">$ch</span>, <span style="color: #800080;">$options</span><span style="color: #000000;">); } </span><span style="color: #008000;">//</span><span style="color: #008000;">https請求 不驗證證書和host</span> curl_setopt(<span style="color: #800080;">$ch</span>, CURLOPT_SSL_VERIFYPEER, <span style="color: #0000ff;">false</span><span style="color: #000000;">); curl_setopt(</span><span style="color: #800080;">$ch</span>, CURLOPT_SSL_VERIFYHOST, <span style="color: #0000ff;">false</span><span style="color: #000000;">); </span><span style="color: #800080;">$data</span> = curl_exec(<span style="color: #800080;">$ch</span><span style="color: #000000;">); curl_close(</span><span style="color: #800080;">$ch</span><span style="color: #000000;">); </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$data</span><span style="color: #000000;">; } </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * 隨機生成一定長度字符串 * @param string $url * @param array $options * @return mixed </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span> createNonceStr(<span style="color: #800080;">$length</span> = 16<span style="color: #000000;">) { </span><span style="color: #800080;">$chars</span> = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'<span style="color: #000000;">; </span><span style="color: #800080;">$str</span> = ''<span style="color: #000000;">; </span><span style="color: #0000ff;">for</span> (<span style="color: #800080;">$i</span> = 0; <span style="color: #800080;">$i</span> < <span style="color: #800080;">$length</span>; <span style="color: #800080;">$i</span>++<span style="color: #000000;">) { </span><span style="color: #800080;">$str</span> .= <span style="color: #008080;">substr</span>(<span style="color: #800080;">$chars</span>, <span style="color: #008080;">mt_rand</span>(0, <span style="color: #008080;">strlen</span>(<span style="color: #800080;">$chars</span>) - 1), 1<span style="color: #000000;">); } </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$str</span><span style="color: #000000;">; } </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * 數(shù)組轉(zhuǎn)成XML * @param string $url * @param array $options * @return mixed </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span> arrayToXml(<span style="color: #800080;">$arr</span><span style="color: #000000;">) { </span><span style="color: #800080;">$xml</span> = "<xml>"<span style="color: #000000;">; </span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$arr</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$key</span> => <span style="color: #800080;">$val</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">if</span> (<span style="color: #008080;">is_numeric</span>(<span style="color: #800080;">$val</span><span style="color: #000000;">)) { </span><span style="color: #800080;">$xml</span> .= "<" . <span style="color: #800080;">$key</span> . ">" . <span style="color: #800080;">$val</span> . "</" . <span style="color: #800080;">$key</span> . ">"<span style="color: #000000;">; } </span><span style="color: #0000ff;">else</span> <span style="color: #800080;">$xml</span> .= "<" . <span style="color: #800080;">$key</span> . "><![CDATA[" . <span style="color: #800080;">$val</span> . "]]></" . <span style="color: #800080;">$key</span> . ">"<span style="color: #000000;">; } </span><span style="color: #800080;">$xml</span> .= "</xml>"<span style="color: #000000;">; </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$xml</span><span style="color: #000000;">; } </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * 例如: * appid: wxd930ea5d5a258f4f * mch_id: 10000100 * device_info: 1000 * Body: test * nonce_str: ibuaiVcKdpRxkhJA * 第一步:對參數(shù)按照 key=value 的格式,并按照參數(shù)名 ASCII 字典序排序如下: * stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_i * d=10000100&nonce_str=ibuaiVcKdpRxkhJA"; * 第二步:拼接支付密鑰: * stringSignTemp="stringA&key=192006250b4c09247ec02edce69f6a2d" * sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7" </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span> getSign(<span style="color: #800080;">$params</span>, <span style="color: #800080;">$key</span><span style="color: #000000;">) { </span><span style="color: #008080;">ksort</span>(<span style="color: #800080;">$params</span>,<span style="color: #000000;"> SORT_STRING); </span><span style="color: #800080;">$unSignParaString</span> = <span style="color: #800080;">$this</span>->formatQueryParaMap(<span style="color: #800080;">$params</span>, <span style="color: #0000ff;">false</span><span style="color: #000000;">); </span><span style="color: #800080;">$signStr</span> = <span style="color: #008080;">strtoupper</span>(<span style="color: #008080;">md5</span>(<span style="color: #800080;">$unSignParaString</span> . "&key=" . <span style="color: #800080;">$key</span><span style="color: #000000;">)); </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$signStr</span><span style="color: #000000;">; } </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * 簽名時字符組合 * @param string $url * @param array $options * @return mixed </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span> formatQueryParaMap(<span style="color: #800080;">$paraMap</span>, <span style="color: #800080;">$urlEncode</span> = <span style="color: #0000ff;">false</span><span style="color: #000000;">) { </span><span style="color: #800080;">$buff</span> = ""<span style="color: #000000;">; </span><span style="color: #008080;">ksort</span>(<span style="color: #800080;">$paraMap</span><span style="color: #000000;">); </span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$paraMap</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$k</span> => <span style="color: #800080;">$v</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">null</span> != <span style="color: #800080;">$v</span> && "null" != <span style="color: #800080;">$v</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$urlEncode</span><span style="color: #000000;">) { </span><span style="color: #800080;">$v</span> = <span style="color: #008080;">urlencode</span>(<span style="color: #800080;">$v</span><span style="color: #000000;">); } </span><span style="color: #800080;">$buff</span> .= <span style="color: #800080;">$k</span> . "=" . <span style="color: #800080;">$v</span> . "&"<span style="color: #000000;">; } } </span><span style="color: #800080;">$reqPar</span> = ''<span style="color: #000000;">; </span><span style="color: #0000ff;">if</span> (<span style="color: #008080;">strlen</span>(<span style="color: #800080;">$buff</span>) > 0<span style="color: #000000;">) { </span><span style="color: #800080;">$reqPar</span> = <span style="color: #008080;">substr</span>(<span style="color: #800080;">$buff</span>, 0, <span style="color: #008080;">strlen</span>(<span style="color: #800080;">$buff</span>) - 1<span style="color: #000000;">); } </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$reqPar</span><span style="color: #000000;">; } }</span>
Retrieve instance:
<span style="color: #800080;">$money</span> = 0.1;<span style="color: #008000;">//</span><span style="color: #008000;">訂單金額</span> <span style="color: #800080;">$out_trade_no</span> = 'test_8888888';<span style="color: #008000;">//</span><span style="color: #008000;">唯一的訂單號</span> <span style="color: #800080;">$order_name</span> = '測試訂單';<span style="color: #008000;">//</span><span style="color: #008000;">訂單名稱</span> <span style="color: #800080;">$notifyUrl</span> = 'http://www.test.com/';<span style="color: #008000;">//</span><span style="color: #008000;">支付結(jié)果通知url 不要有問號</span> <span style="color: #800080;">$timeStamp</span> = <span style="color: #008080;">time</span>();<span style="color: #008000;">//</span><span style="color: #008000;">時間戳 //獲取二維碼信息</span> <span style="color: #800080;">$wx_result</span> = <span style="color: #800080;">$this</span>->createJsBizPackage(<span style="color: #800080;">$money</span>, <span style="color: #800080;">$out_trade_no</span>, <span style="color: #800080;">$order_name</span>, <span style="color: #800080;">$notifyUrl</span>, <span style="color: #800080;">$timeStamp</span><span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;">檢測支付狀態(tài)</span> <span style="color: #800080;">$str_status</span> = <span style="color: #800080;">$this</span>->orderQuery(<span style="color: #800080;">$out_trade_no</span>);
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article
Grass Wonder Build Guide | Uma Musume Pretty Derby
4 weeks ago
By Jack chen
Roblox: 99 Nights In The Forest - All Badges And How To Unlock Them
3 weeks ago
By DDD
Uma Musume Pretty Derby Banner Schedule (July 2025)
4 weeks ago
By Jack chen
RimWorld Odyssey Temperature Guide for Ships and Gravtech
3 weeks ago
By Jack chen
Windows Security is blank or not showing options
4 weeks ago
By 下次還敢

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)