<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                # 微信支付 實戰開發 > 現階段,最火的開發都離不開微信相關的 > 近期工作比較忙 正好工作正好是開發微信支付 , 那我現在就查一個微信支付的教程吧 > 希望對著手微信支付的人有所幫助, 微信支付,肯定離不開早一些相關成熟的微信支付類庫了,但我找了很久,完全適合TP5,并且符合相關命名規則的的類庫沒有找到. > 那我就自己改一下吧 現在共享給大家. > 文件放在 extend/com/wxpay文件夾下 > 命名空間問com\wxpay > 源代碼我就放在本節微信支付類庫源代碼 接下來,我們一起開發微信支付吧 ## 微信的支付流程 簡單的說一下支付的流程 第一步 獲取openid 第二步 根據openid進行統一下單獲取訂單號 第三步 根據統一下單的訂單號 獲取獲取JsApi$getParameters參數 最后 JsApi中支付 下面根據這個順路 我們一起來做吧 ## 在base模塊建立一個公共的新控制器 > 我喜歡把一些公用的處理邏輯的類都放到base模塊, > ![](https://box.kancloud.cn/8dadeb5933dc95e5229c208caf9cf331_288x325.png) > 這些以后都是你的寶貝 .. 你懂得 建立好WxPay控制器以后,記得把接口文件的列表也挪過來 ~~~ <?php /** * Created by PhpStorm. * User: Mikkle * Email:776329498@qq.com * Date: 2017/2/4 * Time: 15:48 */ namespace app\base\controller; /** * 微信支付幫助庫 * ==================================================== * 命名空間 com\wxpay\+類名+_pub * 接口分三種類型: * 【請求型接口】--Wxpay_client_ * 統一支付接口類--UnifiedOrder * 訂單查詢接口--OrderQuery * 退款申請接口--Refund * 退款查詢接口--RefundQuery * 對賬單接口--DownloadBill * 短鏈接轉換接口--ShortUrl * 【響應型接口】--Wxpay_server_ * 通用通知接口--Notify * Native支付——請求商家獲取商品信息接口--NativeCall * 【其他】 * 靜態鏈接二維碼--NativeLink * JSAPI支付--JsApi * ===================================================== * 【CommonUtil】常用工具: * trimString(),設置參數時需要用到的字符處理函數 * createNoncestr(),產生隨機字符串,不長于32位 * formatBizQueryParaMap(),格式化參數,簽名過程需要用到 * getSign(),生成簽名 * arrayToXml(),array轉xml * xmlToArray(),xml轉 array * postXmlCurl(),以post方式提交xml到對應的接口url * postXmlSSLCurl(),使用證書,以post方式提交xml到對應的接口url */ use think\Controller; use think\Db; use think\Session; use com\wxpay\UnifiedOrder_pub as UnifiedOrder; use com\wxpay\JsApi_pub as JaApi; class WxPay extends Controller{ } ~~~ ## 建立一個微信配置config參數 ~~~ protected $wx_config=[ 'wechat_appid'=>'wx1111111111111',//微信公眾號身份的唯一標識。審核通過后,在微信發送的郵件中查看 'wechat_mchid'=>'1111111111',//受理商ID,身份標識 商戶號 'wechat_appkey'=>'********************************',//商戶支付密鑰Key。審核通過后,在微信發送的郵件中查看 'wechat_appsecret'=>'****************************',//JSAPI接口中獲取openid,審核后在公眾平臺開啟開發模式后可查看 //證書路徑,注意應該填寫絕對路徑 不用證書也是能支付的 'sslcert_path'=>'', 'sslkey_path'=> '', ]; protected $this->notify_url=""; //自己定義 ~~~ 這些參數是你微信支付的參數 ## 訂單數據庫的設置參數 為了以后程序移植方便,我把訂單數據庫的數據參數化了 這樣大家移植也方便多了 代碼如下 ~~~ protected $order_table_param=[ 'table'=>'my_orders', //訂單表名稱 'no_field'=>'order_no', //訂單號 字段名字 'state_field'=> 'is_pay',//訂單支付狀態值字段名 'amount_field'=>'amount',//訂單金額值字段名 'pay_ok'=> '1', //訂單已支付狀態值 'pay_no'=> '0', // 訂單未支付狀態值 'map' => [['status' => 1] ,[ 'order_state'=>0]], //其他訂單是否可以支付的參數值 ]; ~~~ ## 接下來 類的初始化 在初始化里, 首先定義時區 ,這是參照官方的文檔的 接下來 動態加載config參數 我把支付的參數寫到這個文檔里,而沒有寫的config文件中,主要為了以后移植方便 接下來注入openid,我微信登錄是在控制器類就完成的 所以這里就直接獲取session 然后注入到$this->open_id ~~~ /** * #User: Mikkle * #Email:776329498@qq.com * #Date: */ public function _initialize(){ ini_set('date.timezone','Asia/Shanghai'); config($this->wx_config); //已登陸的設置openid 本人微信登錄是在控制器里完成 if (Session::has('open_id','html5')) $this->open_id=Session::get('open_id','html5'); } ~~~ ## 統一下單方法 接下來 我把官方的統一下單封裝了一個方法 不多說了 源代碼如下 ~~~ /** * 統一下單方法 * #User: Mikkle * #Email:776329498@qq.com * #Date: * @param array $data * @return bool */ protected function unifiedOrder($data=[]){ $unifiedOrder = new UnifiedOrder(); $unifiedOrder->setParameter("openid",$this->open_id); // openid $unifiedOrder->setParameter("body",'商品訂單號'+$data['order_no']); // 商品描術 $unifiedOrder->setParameter("out_trade_no",$data['order_no'].'_'.$unifiedOrder->createNoncestr(6)); // 商戶訂單號 $unifiedOrder->setParameter("total_fee",$data['amount']*100); // 總金額 $unifiedOrder->setParameter("notify_url",$this->notify_url); // 通知地址 $this->notify_url自己定義 $unifiedOrder->setParameter("trade_type","JSAPI"); // 交易類型 return $unifiedOrder->getPrepayId(); } ~~~ ## 獲取JsApi$getParameters參數 接下來封裝獲取Jsapi的參數 ~~~ /** * 獲取JsApi$getParameters參數 * #User: Mikkle * #Email:776329498@qq.com * #Date: * @param string $unified_order * @return string */ protected function getParameters($unified_order=''){ $jsApi= new JaApi(); $jsApi->setPrepayId($unified_order); $jsApiParameters = $jsApi->getParameters(); return $jsApiParameters; } ~~~ ## 準備工作都OK的 下面進入主菜 ## 根據訂單號支付訂單的方法 ### 首先根據訂單號查找訂單 ~~~ $param=$this->order_table_param; $order_info=Db::table($param['table']) ->field(' '. $param['no_field'].' , '.$param['amount_field'].' ') ->where($param['map'][0]) ->where($param['state_field'],'=','0') ->where(['order_no'=>$order_no]) ->find(); ~~~ 我是為了通用性 搞了一個訂單查詢這么復雜 你如果就一個程序用 重新寫一些也可以 ### 判斷訂單狀態 ~~~ if (!$order_info) return ['code'=>1010,'msg'=>'訂單不存在或者已經是完成狀態']; $data=[ 'order_no'=>$order_no, 'amount'=>$order_info['amount'], ]; ~~~ 如何訂單不存在或者已經完成返回錯誤信息 如何訂單存在 獲取訂單金額 ### 進行統一下單 獲取統一下單的訂單號 ~~~ $unified_order = $this->unifiedOrder($data); //統一下單 $this->unified_order=$unified_order; ~~~ ### 獲取JsApi$getParameters參數 ~~~ $jsApiParameters=$this->getParameters($unified_order); ~~~ ## 最后整合代碼整合一個方法 整合好的代碼如下 ~~~ /** * 根據訂單號支付訂單返回$getParameters參數 * #User: Mikkle * #Email:776329498@qq.com * #Date: * @param string $order_no * @param array $param * @return array */ public function payByOrderNo($order_no='2017020453102495',$param=[]){ $param=$this->order_table_param; $order_info=Db::table($param['table']) ->field(' '. $param['no_field'].' , '.$param['amount_field'].' ') ->where($param['map'][0]) ->where($param['state_field'],'=','0') ->where(['order_no'=>$order_no]) ->find(); if (!$order_info) return ['code'=>1010,'msg'=>'訂單不存在或者已經是完成狀態']; $data=[ 'order_no'=>$order_no, 'amount'=>$order_info['amount'], ]; $unified_order = $this->unifiedOrder($data); //統一下單 $this->unified_order=$unified_order; $jsApiParameters=$this->getParameters($unified_order); return ['code'=>1001,'order_no'=>$order_no,'jsApiParameters'=>$jsApiParameters,'amount'=>$order_info['amount'],]; } ~~~ ## 最后 在你的項目的控制器中調用這個方法就能支付了 ~~~ <?php /** * Created by PhpStorm. * User: Mikkle * Email:776329498@qq.com * Date: 2017/2/8 * Time: 11:32 */ namespace app\api\controller; class WxpayAction extends Auth { public function index($order_no='2017020453102495'){ $data=controller('base/WxPay')->payByOrderNo($order_no); $this->assign('amount',$data['amount']); $this->assign('order_no',$order_no); $this->assign("jsApiParameters" ,$data['jsApiParameters']); $this->assign('openid',$this->open_id); return $this->fetch('wxpay/pay'); } } ~~~ 模版的源代碼 ~~~ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0"> <title>微信安全支付</title> <link rel="stylesheet" href="__WECHAT_CSS__/weui.css"/> <link rel="stylesheet" href="__WECHAT_EXAMPLE__/example.css"/> <script type="text/javascript"> function okAjax(out_trade_no,ext){ $.ajax({ type:"post", url:"", data:{out_trade_no:out_trade_no,ext:ext}, dataType:"text", success:function(data){ if(data){ wx.closeWindow() } }, async:false }); } //調用微信JS api 支付 function jsApiCall() { WeixinJSBridge.invoke( 'getBrandWCPayRequest', {$jsApiParameters}, function(res){ if(res.err_msg == "get_brand_wcpay_request:ok" ) { okAjax('{$order_no}','{$order_no}'); }else{ WeixinJSBridge.log(res.err_msg); // alert('{$order_no}'); alert('支付失敗!'+res.err_code+res.err_desc+res.err_msg); } } ); } function callpay() { if (typeof WeixinJSBridge == "undefined"){ if( document.addEventListener ){ document.addEventListener('WeixinJSBridgeReady', jsApiCall, false); }else if (document.attachEvent){ document.attachEvent('WeixinJSBridgeReady', jsApiCall); document.attachEvent('onWeixinJSBridgeReady', jsApiCall); } }else{ jsApiCall(); } } </script> </head> <body ontouchstart> <div class="weui_msg"> <div class="weui_icon_area"><i class="weui_icon_success weui_icon_msg"></i></div> <div class="weui_text_area"> <h2 class="weui_msg_title"><font color="#888">你將為{$order_no}支付{$amount}元</font></h2> </div> </div> <div class="weui_opr_area"> <p class="weui_btn_area"> <button type="button" class="weui_btn weui_btn_primary" onclick="callpay()" >立即支付</button> <a href="javascript:;" onclick="wx.closeWindow()" class="weui_btn weui_btn_default">取消</a> </p> </div> </div> <script src="__WECHAT_EXAMPLE__/zepto.min.js"></script> <script src="__WECHAT_EXAMPLE__/router.min.js"></script> <script src="__WECHAT_EXAMPLE__/example.js"></script> </body> </html> ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看