<address id="tn7bz"></address>

      
      
      <address id="tn7bz"></address>

              <address id="tn7bz"></address>

              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支付的


              評論