PHP微信掃碼支付接入也不是很復雜,前期需要先配置與引入文件,這里首先先分兩步和大家講解一下
生成二維碼掃碼圖片,這里需要配置商戶ID,appid和秘鑰,再調用wxpay類,生成二維碼
header(Content-type:text/html;?Charset=utf-8); $mchid?=?xxxxx;?????//微信支付商戶號?PartnerID?通過微信支付商戶資料審核后郵件發送 $appid?=?xxxxx;?//公眾號APPID?通過微信支付商戶資料審核后郵件發送 $apiKey?=?xxxxx;??//https://pay.weixin.qq.com?帳戶設置-安全設置-API安全-API密鑰-設置API密鑰 $wxPay?=?new?WxpayService($mchid,$appid,$apiKey); $outTradeNo?=?uniqid();???//你自己的商品訂單號 $payAmount?=?0.01;?????//付款金額,單位:元 $orderName?=?支付測試;??//訂單標題 $notifyUrl?=?https://www.xxx.com/wx/;???//付款成功后的回調地址(不要有問號) $payTime?=?time();???//付款時間 $arr?=?$wxPay->createJsBizPackage($payAmount,$outTradeNo,$orderName,$notifyUrl,$payTime); //生成二維碼 $url?=?http://qr.liantu.com/api.php?text=.$arr[code_url]; echo?"<img?src={$url}?style=width:300px;>";
以下是wxpay類,和回調函數都整合在一起了,notify方法是回調地址調用的方法,比如:http://www.xxx.com/wx/notify.php,付款成功后,微信服務器會將付款結果通知到該頁面。
class?WxpayService { ??protected?$mchid; ??protected?$appid; ??protected?$apiKey; ??public?function?__construct($mchid,?$appid,?$key) ??{ ????$this->mchid?=?$mchid; ????$this->appid?=?$appid; ????$this->apiKey?=?$key; ??} ??/** ???*?發起訂單 ???*?@param?float?$totalFee?收款總費用?單位元 ???*?@param?string?$outTradeNo?唯一的訂單號 ???*?@param?string?$orderName?訂單名稱 ???*?@param?string?$notifyUrl?支付結果通知url?不要有問號 ???*?@param?string?$timestamp?訂單發起時間 ???*?@return?array ???*/ ??public?function?createJsBizPackage($totalFee,?$outTradeNo,?$orderName,?$notifyUrl,?$timestamp) ??{ ????$config?=?array( ??????mch_id?=>?$this->mchid, ??????appid?=>?$this->appid, ??????key?=>?$this->apiKey, ????); ????$orderName?=?iconv(GBK,UTF-8,$orderName); ????$unified?=?array( ??????appid?=>?$config[appid], ??????attach?=>?pay,???????//商家數據包,原樣返回,如果填寫中文,請注意轉換為utf-8 ??????body?=>?$orderName, ??????mch_id?=>?$config[mch_id], ??????nonce_str?=>?self::createNonceStr(), ??????notify_url?=>?$notifyUrl, ??????out_trade_no?=>?$outTradeNo, ??????spbill_create_ip?=>?127.0.0.1, ??????total_fee?=>?intval($totalFee?*?100),????//單位?轉為分 ??????trade_type?=>?NATIVE, ????); ????$unified[sign]?=?self::getSign($unified,?$config[key]); ????$responseXml?=?self::curlPost(https://api.mch.weixin.qq.com/pay/unifiedorder,?self::arrayToXml($unified)); ????$unifiedOrder?=?simplexml_load_string($responseXml,?SimpleXMLElement,?LIBXML_NOCDATA); ????if?($unifiedOrder?===?false)?{ ??????die(parse?xml?error); ????} ????if?($unifiedOrder->return_code?!=?SUCCESS)?{ ??????die($unifiedOrder->return_msg); ????} ????if?($unifiedOrder->result_code?!=?SUCCESS)?{ ??????die($unifiedOrder->err_code); ????} ????$codeUrl?=?(array)($unifiedOrder->code_url); ????if(!$codeUrl[0])?exit(get?code_url?error); ????$arr?=?array( ??????"appId"?=>?$config[appid], ??????"timeStamp"?=>?$timestamp, ??????"nonceStr"?=>?self::createNonceStr(), ??????"package"?=>?"prepay_id="?.?$unifiedOrder->prepay_id, ??????"signType"?=>?MD5, ??????"code_url"?=>?$codeUrl[0], ????); ????$arr[paySign]?=?self::getSign($arr,?$config[key]); ????return?$arr; ??} ??public?function?notify() ??{ ????$config?=?array( ??????mch_id?=>?$this->mchid, ??????appid?=>?$this->appid, ??????key?=>?$this->apiKey, ????); ????$postStr?=?$GLOBALS["HTTP_RAW_POST_DATA"]; ????$postObj?=?simplexml_load_string($postStr,?SimpleXMLElement,?LIBXML_NOCDATA); ????if?($postObj?===?false)?{ ??????die(parse?xml?error); ????} ????if?($postObj->return_code?!=?SUCCESS)?{ ??????die($postObj->return_msg); ????} ????if?($postObj->result_code?!=?SUCCESS)?{ ??????die($postObj->err_code); ????} ????$arr?=?(array)$postObj; ????unset($arr[sign]); ????if?(self::getSign($arr,?$config[key])?==?$postObj->sign)?{ ??????echo?<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>; ??????return?$postObj; ????} ??} ??/** ???*?curl?get ???* ???*?@param?string?$url ???*?@param?array?$options ???*?@return?mixed ???*/ ??public?static?function?curlGet($url?=?,?$options?=?array()) ??{ ????$ch?=?curl_init($url); ????curl_setopt($ch,?CURLOPT_RETURNTRANSFER,?1); ????curl_setopt($ch,?CURLOPT_TIMEOUT,?30); ????if?(!empty($options))?{ ??????curl_setopt_array($ch,?$options); ????} ????//https請求?不驗證證書和host ????curl_setopt($ch,?CURLOPT_SSL_VERIFYPEER,?false); ????curl_setopt($ch,?CURLOPT_SSL_VERIFYHOST,?false); ????$data?=?curl_exec($ch); ????curl_close($ch); ????return?$data; ??} ??public?static?function?curlPost($url?=?,?$postData?=?,?$options?=?array()) ??{ ????if?(is_array($postData))?{ ??????$postData?=?http_build_query($postData); ????} ????$ch?=?curl_init(); ????curl_setopt($ch,?CURLOPT_URL,?$url); ????curl_setopt($ch,?CURLOPT_RETURNTRANSFER,?1); ????curl_setopt($ch,?CURLOPT_POST,?1); ????curl_setopt($ch,?CURLOPT_POSTFIELDS,?$postData); ????curl_setopt($ch,?CURLOPT_TIMEOUT,?30);?//設置cURL允許執行的最長秒數 ????if?(!empty($options))?{ ??????curl_setopt_array($ch,?$options); ????} ????//https請求?不驗證證書和host ????curl_setopt($ch,?CURLOPT_SSL_VERIFYPEER,?false); ????curl_setopt($ch,?CURLOPT_SSL_VERIFYHOST,?false); ????$data?=?curl_exec($ch); ????curl_close($ch); ????return?$data; ??} ??public?static?function?createNonceStr($length?=?16) ??{ ????$chars?=?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789; ????$str?=?; ????for?($i?=?0;?$i?<?$length;?$i++)?{ ??????$str?.=?substr($chars,?mt_rand(0,?strlen($chars)?-?1),?1); ????} ????return?$str; ??} ??public?static?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; ??} ??/** ???*?獲取簽名 ???*/ ??public?static?function?getSign($params,?$key) ??{ ????ksort($params,?SORT_STRING); ????$unSignParaString?=?self::formatQueryParaMap($params,?false); ????$signStr?=?strtoupper(md5($unSignParaString?.?"&key="?.?$key)); ????return?$signStr; ??} ??protected?static?function?formatQueryParaMap($paraMap,?$urlEncode?=?false) ??{ ????$buff?=?""; ????ksort($paraMap); ????foreach?($paraMap?as?$k?=>?$v)?{ ??????if?(null?!=?$v?&&?"null"?!=?$v)?{ ????????if?($urlEncode)?{ ??????????$v?=?urlencode($v); ????????} ????????$buff?.=?$k?.?"="?.?$v?.?"&"; ??????} ????} ????$reqPar?=?; ????if?(strlen($buff)?>?0)?{ ??????$reqPar?=?substr($buff,?0,?strlen($buff)?-?1); ????} ????return?$reqPar; ??} }
學習? |? 交流? |? 分享? | ?文章?