<dfn id="phrr9"><dfn id="phrr9"><meter id="phrr9"></meter></dfn></dfn>

      <form id="phrr9"></form>

            PHP是如何實現微信掃碼支付的

            文章熱詞:PHP,微信支付

            日期:2019-04-12 10:07 by admin 3009 0 收藏
            我要分享

            摘要:PHP微信掃碼支付接入也不是很復雜,前期需要先配置與引入文件,這里首先先分兩步和大家講解一下

            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;
            ??}
            }

            學習? |? 交流? |? 分享? | ?文章?

            上一篇:PHP框架對比

            下一篇:PHP是如何實現微信H5支付的


            評論