国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

ThinkPHP框架整合微信支付之Native 掃碼支付模式一圖文詳解

2024-05-05 00:08:12
字體:
供稿:網(wǎng)友

本文實(shí)例講述了ThinkPHP框架整合微信支付之Native 掃碼支付模式一。分享給大家供大家參考,具體如下:

大家好,這篇文章是繼微信支付jsapi篇之后的微信支付系列教程第二篇:掃碼支付之模式一介紹下掃碼支付目前有兩種模式,模式一比模式二稍微復(fù)雜點(diǎn),至于模式一與模式二的具體內(nèi)容,流程,微信開發(fā)文檔都有詳細(xì)介紹,這里就不多說廢話,接下來趕緊上教程!

首先我們還是一樣,導(dǎo)入微信支付的類庫:

ThinkPHP,微信支付,Native,掃碼支付

接下來是Public下的文件:

ThinkPHP,微信支付,Native,掃碼支付

這里的配置跟JSAPI支付一樣,不需要改動(dòng)

具體關(guān)于文件介紹請(qǐng)參考JSAPI支付,這里就不再說明了

接下來直接看控制器部分的代碼:

step1:同樣,先初始化引入WxPayPubHelper類庫

/**     * 初始化     */    public function _initialize()    {        //引入WxPayPubHelper        vendor('WxPayPubHelper.WxPayPubHelper');    }

step2:展示掃碼頁面需要先生存二維碼鏈接

public function native_pay()    {        //設(shè)置靜態(tài)鏈接        $nativeLink = new /NativeLink_pub();                //設(shè)置靜態(tài)鏈接參數(shù)        //設(shè)置必填參數(shù)        //appid已填,商戶無需重復(fù)填寫        //mch_id已填,商戶無需重復(fù)填寫        //noncestr已填,商戶無需重復(fù)填寫        //time_stamp已填,商戶無需重復(fù)填寫        //sign已填,商戶無需重復(fù)填寫        $product_id = C('WxPayConf_pub.APPID')."static";//自定義商品id        $nativeLink->setParameter("product_id",$product_id);//商品id        //獲取鏈接        $product_url = $nativeLink->getUrl();        //使用短鏈接轉(zhuǎn)換接口        $shortUrl = new /ShortUrl_pub();        //設(shè)置必填參數(shù)        //appid已填,商戶無需重復(fù)填寫        //mch_id已填,商戶無需重復(fù)填寫        //noncestr已填,商戶無需重復(fù)填寫        //sign已填,商戶無需重復(fù)填寫        $shortUrl->setParameter("long_url",$product_url);//URL鏈接        //獲取短鏈接        $codeUrl = $shortUrl->getShortUrl();        $this->assign('product_url',$product_url);        $this->assign('codeUrl',$codeUrl);        $this->display();            }

以上代碼對(duì)應(yīng)native_pay.html頁面

<!DOCTYPE HTML><html><head>    <meta charset="UTF-8">    <title>微信安全支付</title></head><body>    <div align="center" id="qrcode">        <p >掃我,掃我</p>    </div>    <div align="center">        <a href="#" rel="external nofollow" >返回首頁</a>    </div></body>    <script src="__PUBLIC__/js/qrcode.js"></script>    <script>        var url = "<?php echo $product_url;?>";        //參數(shù)1表示圖像大小,取值范圍1-10;參數(shù)2表示質(zhì)量,取值范圍'L','M','Q','H'        var qr = qrcode(10, 'M');        qr.addData(url);        qr.make();        var dom=document.createElement('DIV');        dom.innerHTML = qr.createImgTag();        var element=document.getElementById("qrcode");        element.appendChild(dom);    </script></html>

這里注意生存二維碼的js地址,我放在了Public下的JS目錄下

step3:掃碼之后,就會(huì)提交給我們公眾平臺(tái)native配置的地址對(duì)應(yīng)的去方法處理公眾平臺(tái)navtive配置:配置地址 http://您的域名/Pay/index.php/Home/WxNative/todoPost

ThinkPHP,微信支付,Native,掃碼支付

對(duì)應(yīng)的todoPost方法在控制器中:

public function todoPost()    {        //以log文件形式記錄回調(diào)信息,用于調(diào)試        $log_name = __ROOT__."/Public/native_call.log";        //使用native通知接口        $nativeCall = new /NativeCall_pub();                //接收微信請(qǐng)求        $xml = $GLOBALS['HTTP_RAW_POST_DATA'];        log_result($log_name,"【接收到的native通知】:/n".$xml."/n");        $nativeCall->saveData($xml);                if($nativeCall->checkSign() == FALSE){            $nativeCall->setReturnParameter("return_code","FAIL");//返回狀態(tài)碼            $nativeCall->setReturnParameter("return_msg","簽名失敗");//返回信息        }        else        {            //提取product_id            $product_id = $nativeCall->getProductId();                    //使用統(tǒng)一支付接口            $unifiedOrder = new /UnifiedOrder_pub();                    //根據(jù)不同的$product_id設(shè)定對(duì)應(yīng)的下單參數(shù),此處只舉例一種            switch ($product_id)            {                                case C('WxPayConf_pub.APPID')."static"://與native_call_qrcode.php中的靜態(tài)鏈接二維碼對(duì)應(yīng)                    //設(shè)置統(tǒng)一支付接口參數(shù)                    //設(shè)置必填參數(shù)                    //appid已填,商戶無需重復(fù)填寫                    //mch_id已填,商戶無需重復(fù)填寫                    //noncestr已填,商戶無需重復(fù)填寫                    //spbill_create_ip已填,商戶無需重復(fù)填寫                    //sign已填,商戶無需重復(fù)填寫                    $unifiedOrder->setParameter("body","貢獻(xiàn)一分錢");//商品描述                    //自定義訂單號(hào),此處僅作舉例                    $timeStamp = time();                    $out_trade_no = C('WxPayConf_pub.APPID').$timeStamp;                    $unifiedOrder->setParameter("out_trade_no",$out_trade_no);//商戶訂單號(hào)             $unifiedOrder->setParameter("product_id","$product_id");//商品ID                    $unifiedOrder->setParameter("total_fee","1");//總金額                    $unifiedOrder->setParameter("notify_url",C('WxPayConf_pub.NOTIFY_URL'));//通知地址                    $unifiedOrder->setParameter("trade_type","NATIVE");//交易類型                    $unifiedOrder->setParameter("product_id",$product_id);//用戶標(biāo)識(shí)                    //非必填參數(shù),商戶可根據(jù)實(shí)際情況選填                    //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商戶號(hào)                    //$unifiedOrder->setParameter("device_info","XXXX");//設(shè)備號(hào)                    //$unifiedOrder->setParameter("attach","XXXX");//附加數(shù)據(jù)                    //$unifiedOrder->setParameter("time_start","XXXX");//交易起始時(shí)間                    //$unifiedOrder->setParameter("time_expire","XXXX");//交易結(jié)束時(shí)間                    //$unifiedOrder->setParameter("goods_tag","XXXX");//商品標(biāo)記                    //$unifiedOrder->setParameter("openid","XXXX");//用戶標(biāo)識(shí)                            //獲取prepay_id                    $prepay_id = $unifiedOrder->getPrepayId();                    //設(shè)置返回碼                    //設(shè)置必填參數(shù)                    //appid已填,商戶無需重復(fù)填寫                    //mch_id已填,商戶無需重復(fù)填寫                    //noncestr已填,商戶無需重復(fù)填寫                    //sign已填,商戶無需重復(fù)填寫                    $nativeCall->setReturnParameter("return_code","SUCCESS");//返回狀態(tài)碼                    $nativeCall->setReturnParameter("result_code","SUCCESS");//業(yè)務(wù)結(jié)果                    $nativeCall->setReturnParameter("prepay_id",$prepay_id);//預(yù)支付ID                            break;                default:                    //設(shè)置返回碼                    //設(shè)置必填參數(shù)                    //appid已填,商戶無需重復(fù)填寫                    //mch_id已填,商戶無需重復(fù)填寫                    //noncestr已填,商戶無需重復(fù)填寫                    //sign已填,商戶無需重復(fù)填寫                    $nativeCall->setReturnParameter("return_code","SUCCESS");//返回狀態(tài)碼                    $nativeCall->setReturnParameter("result_code","FAIL");//業(yè)務(wù)結(jié)果                    $nativeCall->setReturnParameter("err_code_des","此商品無效");//業(yè)務(wù)結(jié)果                    break;            }                }                //將結(jié)果返回微信        $returnXml = $nativeCall->returnXml();        log_result($log_name,"【返回微信的native響應(yīng)】:/n".$returnXml."/n");        echo $returnXml;    }

其實(shí)到這里你已經(jīng)完成了掃碼支付模式一的功能

step4:接下來寫一下異步通知處理,與jsapi支付一樣:

public function notify()    {        //使用通用通知接口        $notify = new /Notify_pub();                 //存儲(chǔ)微信的回調(diào)        $xml = $GLOBALS['HTTP_RAW_POST_DATA'];        $notify->saveData($xml);                 //驗(yàn)證簽名,并回應(yīng)微信。        //對(duì)后臺(tái)通知交互時(shí),如果微信收到商戶的應(yīng)答不是成功或超時(shí),微信認(rèn)為通知失敗,        //微信會(huì)通過一定的策略(如30分鐘共8次)定期重新發(fā)起通知,        //盡可能提高通知的成功率,但微信不保證通知最終能成功。        if($notify->checkSign() == FALSE){            $notify->setReturnParameter("return_code","FAIL");//返回狀態(tài)碼            $notify->setReturnParameter("return_msg","簽名失敗");//返回信息        }else{            $notify->setReturnParameter("return_code","SUCCESS");//設(shè)置返回碼        }        $returnXml = $notify->returnXml();        echo $returnXml;                 //==商戶根據(jù)實(shí)際情況設(shè)置相應(yīng)的處理流程,此處僅作舉例=======                 //以log文件形式記錄回調(diào)信息        //         $log_ = new Log_();        $log_name= __ROOT__."/Public/notify_url.log";//log文件路徑                 $this->log_result($log_name,"【接收到的notify通知】:/n".$xml."/n");                 if($notify->checkSign() == TRUE)        {            if ($notify->data["return_code"] == "FAIL") {                //此處應(yīng)該更新一下訂單狀態(tài),商戶自行增刪操作                log_result($log_name,"【通信出錯(cuò)】:/n".$xml."/n");            }            elseif($notify->data["result_code"] == "FAIL"){                //此處應(yīng)該更新一下訂單狀態(tài),商戶自行增刪操作                log_result($log_name,"【業(yè)務(wù)出錯(cuò)】:/n".$xml."/n");            }            else{                //此處應(yīng)該更新一下訂單狀態(tài),商戶自行增刪操作                log_result($log_name,"【支付成功】:/n".$xml."/n");            }                         //商戶自行增加處理流程,            //例如:更新訂單狀態(tài)            //例如:數(shù)據(jù)庫操作            //例如:推送支付完成信息        }    }

native掃碼支付模式一demo到此就可以啦

下面展示下測(cè)試的截圖:

掃碼界面:

ThinkPHP,微信支付,Native,掃碼支付

掃碼結(jié)果:

ThinkPHP,微信支付,Native,掃碼支付

有問題請(qǐng)留言,下面還會(huì)介紹微信掃碼支付模式二的詳細(xì)教程

希望本文所述對(duì)大家基于ThinkPHP框架的PHP程序設(shè)計(jì)有所幫助。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到PHP教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 库尔勒市| 修水县| 鄂尔多斯市| 清涧县| 金平| 萝北县| 嘉禾县| 临潭县| 六安市| 柘荣县| 松溪县| 靖安县| 灵寿县| 治多县| 古田县| 鲁甸县| 建宁县| 蓝田县| 太和县| 钟祥市| 监利县| 成武县| 巴楚县| 泊头市| 岑溪市| 威信县| 安平县| 清徐县| 光泽县| 山东| 大城县| 绥棱县| 聂拉木县| 台东县| 敦煌市| 龙海市| 肥西县| 弋阳县| 常熟市| 拜泉县| 永靖县|