亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PHP:微信支付服務商開發相關的那點事

2020-03-22 17:33:12
字體:
來源:轉載
供稿:網友

項目背景

不是什么大項目,使用微信服務商來管理多個子商戶,并使用服務商的接口替子商戶下單,服務商后臺才能接收到回調

使用場景是web掃碼支付

準備

域名應該要在服務商所歸屬的公眾號內“網頁授權域名”設置好(不知此操作是否需要?)

在支付服務商后臺設置好回調地址(子商戶應該是不用設置)

項目使用apache+php為后臺服務,下載官方支付php demo(native)

我們直接先按照demo的目錄結構來玩,直接把解壓的example和lib,2個目錄都到服務器根目錄

在example目錄下,創建cert目錄,進服務商后臺-賬戶中心-api安全,下載證書,放到這個目錄內

在example目錄下,創建logs目錄,用于微信支付log類寫日志文件

由于微信支付相關都要使用https,所以查看訪問日志在apache目錄下的logs目錄,ssl_request.txt文件,最下面,可以看到回調地址是否被請求

注意

官方demo有2個方式的掃碼支付,第一種方式已經不提供,都使用第二種

官方的demo,會有不能顯示二維碼的bug,例子頁面是native.php

打印print_r($result); 這個,會顯示錯誤,主要是關于于curl的錯誤,自行百度解決

配置

在WxPay.Config.Interface.php中的接口對象中增加一個公共方法html' target='_blank'>public abstract function GetSubMchId(); //獲取子商戶id在WxPay.Config.php內中,配置需要的參數,自行百度,并且增加一個方法public function GetSubMchId(){ return '8888888888'; //返回子商戶號 by vbyzc }在lib/WxPay.Api.php 內,在統一下單方法unifiedOrder中,下面的參數那段位置,增加$inputObj->SetSub_mch_id($config->GetSubMchId());//子商戶號 by vbyzc在各個需要查詢訂單的的地方回調,付款頁面實時檢測訂單支付狀態的請求頁面,都要使用此方法來設置子商戶id:
$input->SetSub_mch_id($config->GetSubMchId());注意,有的地方可能沒有$config對象,請引入WxPay.Config.php ,并初始化:$config = new WxPayConfig();

部分代碼

掃碼頁面:native.php

<?php/**** example目錄下為簡單的支付樣例,僅能用于搭建快速體驗微信支付使用* 樣例的作用僅限于指導如何使用sdk,在安全上面僅做了簡單處理, 復制使用樣例代碼時請慎重* 請勿直接直接使用樣例對外提供服務* **/require_once "../lib/WxPay.Api.php";require_once "WxPay.NativePay.php";require_once 'log.php';//初始化日志$logHandler= new CLogFileHandler("logs/".date('Y-m-d').'.log');$log = Log::Init($logHandler, 15);//模式一//官方不再提供模式一支付方式$notify = new NativePay();//模式二/** * 流程: * 1、調用統一下單,取得code_url,生成二維碼 * 2、用戶掃描二維碼,進行支付 * 3、支付完成之后,微信服務器會通知支付成功 * 4、在支付成功通知中需要查單確認是否真正支付成功(見:notify.php) */$out_trade_no = "vbyzc_for_jstx".date("YmdHis"); $input = new WxPayUnifiedOrder();$input->SetBody("test_body");$input->SetAttach("test_Attach");//成功支付的回調里會返回這個$input->SetOut_trade_no($out_trade_no);//自定義訂單號$input->SetTotal_fee("1"); // 金額$input->SetTime_start(date("YmdHis"));// $input->SetTime_expire(date("YmdHis", time() + 500));$input->SetGoods_tag("test_goodsTag");$input->SetNotify_url("https://service.ktfqs.com/example/wx_pay_callback.php");$input->SetTrade_type("NATIVE");$input->SetProduct_id("123456789"); //此id為二維碼中包含的商品ID,商戶自行定義。$result = $notify->GetPayUrl($input);$url2 = $result["code_url"];echo "<div>這是返回:$url2</div>";print_r($result);?><html><head>    <meta http-equiv="content-type" content="text/html;charset=utf-8"/>    <meta name="viewport" content="width=device-width, initial-scale=1" />     <title>掃碼支付</title>    <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script></head><body>    <div style="margin-left: 10px;color:#556B2F;font-size:30px;font-weight: bolder;">掃描支付模式二</div><br/>    <div> 訂單編號<input id="out_trade_no" type="hidden"  value="<?php echo $out_trade_no;?>"> </div>    <img alt="模式二掃碼支付" src="qrcode.php?data=<?php echo urlencode($url2);?>" style="width:150px;height:150px;"/>    <div>支付提示:<span id="query_result" style="color: red">WAITING...</span></div>    <script>        var t1;        var sum=0;        $(document).ready(function () {            t1=setInterval("ajaxstatus()", 4000);        });        function ajaxstatus() {            sum++;            if(sum>100){ window.clearInterval(t1);return false;}            if ($("#out_trade_no").val() != 0) {                $.post("orderqueryajax.php", { out_trade_no:$("#out_trade_no").val() }, function (data) {                    data = $.trim(data);                    $("#query_result").html(data);                    if (data=="SUCCESS") {                        $("#query_result").html("哈哈哈??!支付成功,即將跳轉...");                        window.clearInterval(t1)                        <?php                            // 插入php代碼                            /*                            if (isset($_POST['history_go']) && $_POST['history_go'] == 3){                                echo 'window.setTimeout("history.go(-3);",2000);';                            }else{                                echo 'window.setTimeout("history.go(-2);",2000);';                            }                            */                        ?>                    }                });            }        }    </script></body></html>

查詢并返回訂單狀態頁面:orderqueryajax.php

<?php/**** ajax異步查詢訂單是否完成* **/require_once "../lib/WxPay.Api.php";require_once 'log.php';require_once "WxPay.Config.php";//初始化日志$logHandler= new CLogFileHandler("../logs/".date('Y-m-d').'.log');$log = Log::Init($logHandler, 15);$v = $_POST["out_trade_no"];if(isset($v) && $v != ""){    $out_trade_no = $v;    $config = new WxPayConfig();    $input = new WxPayOrderQuery();    $input->SetOut_trade_no($out_trade_no);    $input->SetSub_mch_id($config->GetSubMchId());//子商戶號 by vbyzc    $result = WxPayApi::orderQuery($config, $input);    if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS'){//返回查詢結果        echo $result['trade_state'];    }else{        echo "FAIL";    }}?>

回調頁:notify.php

<?phpdate_default_timezone_set('PRC');/**** example目錄下為簡單的支付樣例,僅能用于搭建快速體驗微信支付使用* 樣例的作用僅限于指導如何使用sdk,在安全上面僅做了簡單處理, 復制使用樣例代碼時請慎重* 請勿直接直接使用樣例對外提供服務* **/// 鏈接數據庫include_once('../include/conn_db.php');include_once('../include/db_class.php');mysql_connect(HOST,NAME,PASS) or die(mysql_error());mysql_select_db(DBNAME);mysql_query('SET NAMES '.CODEPAGE);require_once "../lib/WxPay.Api.php";require_once '../lib/WxPay.Notify.php';require_once "WxPay.Config.php";require_once 'log.php';//初始化日志$logHandler= new CLogFileHandler("logs/".date('Y-m-d').'.log');$log = Log::Init($logHandler, 15);class PayNotifyCallBack extends WxPayNotify{    //查詢訂單    public function Queryorder($transaction_id)    {        $input = new WxPayOrderQuery();        $config = new WxPayConfig();        $input->SetTransaction_id($transaction_id);        $input->SetSub_mch_id($config->GetSubMchId()); //設置子商戶號  by vbyzc        $result = WxPayApi::orderQuery($config, $input);        Log::DEBUG("query:" . json_encode($result));        if(array_key_exists("return_code", $result)            && array_key_exists("result_code", $result)            && $result["return_code"] == "SUCCESS"            && $result["result_code"] == "SUCCESS")        {            return true;        }        return false;    }    /**    *    * 回包前的回調方法    * 業務可以繼承該方法,打印日志方便定位    * @param string $xmlData 返回的xml參數    *    **/    public function LogAfterProcess($xmlData)    {        Log::DEBUG("call back, return xml:" . $xmlData);        return;    }        //重寫回調處理函數    /**     * @param WxPayNotifyResults $data 回調解釋出的參數     * @param WxPayConfigInterface $config     * @param string $msg 如果回調處理失敗,可以將錯誤信息輸出到該方法     * @return true回調出來完成不需要繼續回調,false回調處理未完成需要繼續回調     */    public function NotifyProcess($objData, $config, &$msg)    {        $data = $objData->GetValues();        //TODO 1、進行參數校驗        if(!array_key_exists("return_code", $data)             ||(array_key_exists("return_code", $data) && $data['return_code'] != "SUCCESS")) {            //TODO失敗,不是支付成功的通知            //如果有需要可以做失敗時候的一些清理處理,并且做一些監控            $msg = "異常異常";            return false;        }        if(!array_key_exists("transaction_id", $data)){            $msg = "輸入參數不正確";            return false;        }        //TODO 2、進行簽名驗證        try {            $checkResult = $objData->CheckSign($config);            if($checkResult == false){                //簽名錯誤                Log::ERROR("簽名錯誤...");                return false;            }        } catch(Exception $e) {            Log::ERROR(json_encode($e));        }        //TODO 3、處理業務邏輯        Log::DEBUG("call back JSON:" . json_encode($data));        $notfiyOutput = array();        /* 返回的格式         {            "appid": "wxa664cef2fee1b641", //調用接口提交的公眾賬號ID            "attach": "test",//附加數據,在查詢API和支付通知中原樣返回,該字段主要用于商戶攜帶訂單的自定義數據 (使用SetAttach設置的)            "bank_type": "LQT",//不知什么鬼東西            "cash_fee": "1",// 金額            "fee_type": "CNY",//貨幣類型            "is_subscribe": "N",//不知什么鬼東西            "mch_id": "154133502151",// 商戶號(服務商)            "nonce_str": "jw0bvddz275qyvxnpdfoaam55h3dw6uk",//微信返回的隨機字符串            "openid": "opnVE5pDPx2hWAoLLxyQW5KQt8GA",// 用戶openid(應該是對于綁定的公從號)            "out_trade_no": "vbyzc_for_jstx20190701010509",// 發起訂單時自定義訂單號            "result_code": "SUCCESS",// 業務結果            "return_code": "SUCCESS",// 此字段是通信標識,非交易標識,交易是否成功需要查看result_code來判斷            "sign": "80E46C6CC50C25E6B5099AE4E03DA3C6FEFD5B172A99B03A56FAC4A9E11EC8F3",//            "sub_mch_id": "154172463171",// 子商戶id            "time_end": "20190701090530",// 交易結束時間??            "total_fee": "1",// 總金額            "trade_type": "NATIVE",// 支付方式            "transaction_id": "4200000301201907011310094985" // 微信支付單號        }        */        //查詢訂單,判斷訂單真實性        if(!$this->Queryorder($data["transaction_id"])){            $msg = "訂單查詢失敗";            Log::DEBUG("vbyzc run to here : order querySelect faild!!!!!" );            return false;        }        // 根據微信官方原代碼的業務流程,應該是如下:        // 支會成功后微信會不斷請求回調,在上面的代碼 應該是包函了回調回應的代碼,        // 如果成功回應,微信支付應該就停止請求回調,才能執行下面的代碼         Log::DEBUG("vbyzc run to here :<<<<<<<<<<<<<<start to mysql record" );        $openid = $data['openid'];// 微信用戶        $trade_no = $data['transaction_id'];// 微信支付單號        $mch_id = $data['mch_id'];// 商戶號        $sub_mch_id = $data['sub_mch_id'];// 子商戶id        $trade_status = $data['result_code'];// 業務結果        $total_amount = $data['total_fee'];// 總金額        $out_trade_no = $data['out_trade_no'];// 商戶自定義訂單號        $cmd = "insert into myorder(openid,trade_no,mch_id,sub_mch_id,trade_status,total_amount,out_trade_no,datetime)         values ('$openid','$trade_no','$mch_id','$sub_mch_id','$trade_status',$total_amount,'$out_trade_no',NOW())";        mysql_query($cmd);        Log::DEBUG("vbyzc run to here :end to mysql record>>>>>>>>>>" );        return true;    }}$config = new WxPayConfig();Log::DEBUG("begin notify");$notify = new PayNotifyCallBack();$notify->Handle($config, false);?>

更多PHP相關技術文章,請訪問PHP教程欄目進行學習!

以上就是PHP:微信支付服務商開發相關的那點事的詳細內容,更多請關注 其它相關文章!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
一区二区三欧美| 青草青草久热精品视频在线观看| 精品丝袜一区二区三区| 久久综合久久88| 国产成人在线一区二区| 成人动漫网站在线观看| 久久频这里精品99香蕉| 欧美一级成年大片在线观看| 日韩激情av在线免费观看| 九九精品在线视频| 2023亚洲男人天堂| 丝袜情趣国产精品| 一本大道久久加勒比香蕉| 伊人亚洲福利一区二区三区| 97视频在线观看网址| 日韩乱码在线视频| 亚洲欧美另类自拍| 97人洗澡人人免费公开视频碰碰碰| 亚洲级视频在线观看免费1级| 日韩中文理论片| 日韩视频亚洲视频| 欧美视频在线观看 亚洲欧| 亚洲精品久久久久久久久久久久久| 国产精品盗摄久久久| 久久国产精品网站| 亚洲aaa激情| 成人信息集中地欧美| 国产福利视频一区| 国产精品网址在线| 一区二区三区四区视频| 欧美性猛交xxxx乱大交| 日韩在线播放av| 亚洲精品网站在线播放gif| 91欧美日韩一区| 国产不卡精品视男人的天堂| 日韩中文字幕网址| 国产精品中文久久久久久久| 日韩中文字幕不卡视频| 疯狂做受xxxx高潮欧美日本| 亚洲精品欧美日韩专区| 欧美极品少妇xxxxⅹ喷水| 亚洲精品短视频| 国产精品专区h在线观看| 国产精品27p| 国产精品久久久久一区二区| 伊人成人开心激情综合网| 亚洲人成电影在线观看天堂色| 亚洲欧美在线播放| 国产成人aa精品一区在线播放| 91精品国产色综合久久不卡98口| 久久综合国产精品台湾中文娱乐网| 国产精品男女猛烈高潮激情| 久久国产精品久久久久| 久久久黄色av| 97国产精品视频| 欧美激情中文网| 国产成人福利夜色影视| 91豆花精品一区| 亚洲激情视频网| 黄色精品在线看| 日韩av在线最新| 日韩在线观看电影| 久热在线中文字幕色999舞| 久久成人国产精品| 色偷偷888欧美精品久久久| 亚洲精品网址在线观看| 91免费国产网站| 国产欧美日韩91| 亚洲色图第三页| 欧美精品免费在线观看| 91精品国产成人www| 亚洲美女激情视频| 国产精品99免视看9| 这里只有精品丝袜| 国产精品美腿一区在线看| 日韩**中文字幕毛片| 亚洲电影免费观看| 亚洲三级免费看| 欧美伊久线香蕉线新在线| 欧美大人香蕉在线| 日韩欧美亚洲成人| 日韩大片在线观看视频| 国产主播欧美精品| 欧美电影在线观看网站| 欧美俄罗斯乱妇| 欧美成人一二三| 午夜免费日韩视频| 国产精品免费一区豆花| 中文字幕亚洲一区在线观看| 亚洲精品一区av在线播放| 久久91亚洲精品中文字幕| 国产美女精品视频免费观看| 中文字幕亚洲欧美在线| 日韩欧美精品在线观看| 国产精品一区二区女厕厕| 欧美激情精品久久久久久变态| 国产亚洲欧洲在线| 日韩视频欧美视频| 久久久久久久一| 色婷婷亚洲mv天堂mv在影片| 91精品91久久久久久| 欧美日韩亚洲激情| 国产精品第七十二页| 九九热这里只有精品免费看| 欧美激情一区二区久久久| 91精品视频免费| 亚洲欧美日本另类| 精品久久久91| 国产亚洲一级高清| 成人春色激情网| 97超视频免费观看| 68精品久久久久久欧美| 成人午夜在线影院| 这里只有视频精品| 欧美成年人网站| 亚洲精品午夜精品| 亚洲一级黄色av| 91亚洲国产成人精品性色| 国产精品扒开腿做爽爽爽的视频| 97**国产露脸精品国产| 精品女同一区二区三区在线播放| 亚洲成人免费在线视频| 一区二区三区天堂av| 国产欧美va欧美va香蕉在线| 精品少妇一区二区30p| 国产性猛交xxxx免费看久久| 日本人成精品视频在线| 正在播放欧美视频| 国产精品美女久久久久久免费| 亚洲最大成人网色| 亚洲男人天堂古典| 91色琪琪电影亚洲精品久久| 日韩欧美在线播放| 久热精品视频在线观看| 中文字幕日韩av综合精品| 欧美激情在线狂野欧美精品| 亚洲久久久久久久久久久| 欧美人与性动交| 在线电影中文日韩| 精品久久久久久久久久国产| 亚洲嫩模很污视频| 久久精品电影网| 国产精品成人av性教育| 久久亚洲国产精品成人av秋霞| 性金发美女69hd大尺寸| 91av在线看| 亚洲级视频在线观看免费1级| 欧洲精品久久久| 亚洲一区二区三区香蕉| 日韩成人中文字幕| 国产精品第一视频| 狠狠躁夜夜躁人人爽天天天天97| 久久韩剧网电视剧| 久久精品在线播放| 日韩亚洲成人av在线| 日韩欧美在线免费观看| 久久免费成人精品视频| 日韩中文字幕网| 国模极品一区二区三区| 亚洲一级黄色片| 在线观看久久av| 成人免费高清完整版在线观看| 国产美女扒开尿口久久久| 久久久视频免费观看|