<nav id="camkq"><strong id="camkq"></strong></nav>
  • <xmp id="camkq"><menu id="camkq"></menu>
  • <nav id="camkq"></nav><nav id="camkq"></nav>

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


    評論