1. 程式人生 > >THINKPHP 3.1.x 整合微信支付

THINKPHP 3.1.x 整合微信支付

導語

支付寶和微信,在目前的生態下,都得整合接入

開發前請申請認證微信公眾號,申請開通微信商戶

環境:

Thinkphp 3.1.x

Wxpay php sdk v3

方式:

PC端掃碼支付及公眾號內JSAPI支付

1.微信支付配置



2. WXPAY php skd

2.1下載地址:

http://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=11_1

2.2 整合進thinkphp

解包後重命令目錄為wxpay,複製到WEBROOT/Core/Extend/Vendor/wxpay

根據thinkphp vendor命名模式對vendor中的lib/*, unit/*進行重新命名,並注意檔案中引用用語句,如require_once/require,否則由於inlcude_path問題造成引用報錯

具體檔案列表為

libs/Wx.......php

unit/log.php

unit/Wx......php

unit/phpqrcode.php

只需要處理這部分核心檔案

2.3 配置檔案

將公眾號appid/appsecrect,商戶id/secret 修改到libs/WxPayConfig.php

3.Thinkphp 接入

自定義model

WxpayModel.class.php 用於發起支付資訊

<?php


class WxpayModel extends Model{


    //在類初始化方法中,引入相關類庫
    public function _initialize() {
        vendor( 'Wxpay.unit.log' );
        vendor( 'Wxpay.lib.WxPayConfig' );
        vendor( 'Wxpay.lib.WxPayApi' );
        vendor( 'Wxpay.lib.WxPayData' );
        vendor( 'Wxpay.lib.WxPayException' );
        vendor( 'Wxpay.lib.WxPayNotify' );
        vendor( 'Wxpay.lib.WxPayMicroPay' );
        vendor( 'Wxpay.lib.WxPayNativePay' );
        vendor( 'Wxpay.unit.phpqrcode.phpqrcode' );
    }


    //doalipay方法
    /*該方法其實就是將介面檔案包下alipayapi.php的內容複製過來
          然後進行相關處理
        */
    public function nativepay($order = array()) {

        //模式一
        $notify = new NativePay();

        //模式二
        $input = new WxPayUnifiedOrder();
        $input->SetBody($order['names']);
        $input->SetAttach($order['names']);
        $input->SetOut_trade_no($order['trade_no']);

        $total_fee = $order['total_fee'];
        $input->SetTotal_fee($total_fee);
        $input->SetTime_start(date("YmdHis"));
        $input->SetTime_expire(date("YmdHis", time() + 600));
        $input->SetGoods_tag($order['names']);
        $input->SetNotify_url("http://www.aaa.com/wxpay/notify");
        $input->SetTrade_type("NATIVE");
        $input->SetProduct_id($order['product_id']);

        $result = $notify->GetPayUrl($input);
        $url = $result["code_url"];
<p class="p1"><span class="s1">$html_text = '<div style="margin-left: 10px;color:#556B2F;font-size:30px;font-weight: bolder;">掃描二維碼支付</div><br/></span></p><p class="p1"><span class="s1">    <img alt="掃描二維碼支付" src="'.U('wxpay/qrcode').'?data='.$url.'" style="width:300px;height:300px;"/>';</span></p>
        return $html_text;
    }

    public function jsapipay($order = array()) {

        //獲取使用者openid
        $tools = new JsApiPay();
        $openId = $tools->GetOpenid();
        //統一下單
        $input = new WxPayUnifiedOrder();
        $input->SetBody($order['names']);
        $input->SetAttach($order['names']);
        $input->SetOut_trade_no($order['trade_no']);
        $total_fee = $order['total_fee'];
        $input->SetTotal_fee($total_fee);
        $input->SetTime_start(date("YmdHis"));
        $input->SetTime_expire(date("YmdHis", time() + 600));
        $input->SetGoods_tag($order['names']);
        $input->SetNotify_url("http://www.aaa.com/wxpay/notify");

        $input->SetTrade_type("JSAPI");
        $input->SetOpenid($openId);
        $order = WxPayApi::unifiedOrder($input);
        $jsApiParameters = $tools->GetJsApiParameters($order);
        $html_text = $jsApiParameters;
        return $html_text;
    }

WxnotifyModel.class.php

<?php


vendor( 'Wxpay.unit.log' );
vendor( 'Wxpay.lib.WxPayConfig' );
vendor( 'Wxpay.lib.WxPayApi' );
vendor( 'Wxpay.lib.WxPayData' );
vendor( 'Wxpay.lib.WxPayException' );
vendor( 'Wxpay.lib.WxPayNotify' );
vendor( 'Wxpay.lib.WxPayMicroPay' );
vendor( 'Wxpay.lib.WxPayNativePay' );
vendor( 'Wxpay.unit.phpqrcode.phpqrcode' );

class WxnotifyModel extends WxPayNotify {


        public function NotifyProcess($data, &$msg)
        {
                //echo "處理回撥";
                Log::write("call back:" . json_encode($data), Log::INFO);

                $out_trade_no = $data['out_trade_no'];

                if($data['result_code'] == 'SUCCESS') {
                        //SQL update
                } else {
                        return false;
                }

                return true;
        }
}


增加WxpayAction.class.php用於notify或跳轉
<?php

class wxpayAction extends CommonAction {

        protected $authentic = 0; //是否開啟使用者認證,0:不開啟,1:開啟

    //在類初始化方法中,引入相關類庫
    public function _initialize() {

        vendor( 'Wxpay.unit.log' );
        vendor( 'Wxpay.lib.WxPayConfig' );
        vendor( 'Wxpay.lib.WxPayApi' );
        vendor( 'Wxpay.lib.WxPayData' );
        vendor( 'Wxpay.lib.WxPayException' );
        vendor( 'Wxpay.lib.WxPayNotify' );
        vendor( 'Wxpay.lib.WxPayMicroPay' );
        vendor( 'Wxpay.lib.WxPayNativePay' );
        vendor( 'Wxpay.unit.phpqrcode.phpqrcode' );
    }

    public function qrcode() {

                $url = urldecode($_GET["data"]);
                QRcode::png($url);
    }

    public function notify() {

        return D('Wxnotify')->Handle(true);
    }

}


最後在訂單生成頁呼叫以上model發起支付

掃碼支付直接顯示model中生成的html

JSAPI支付需要WeixinJSBridge類發起,如以下程式碼

<script type="text/javascript">


        //呼叫微信JS api 支付
        function jsApiCall()
        {
                WeixinJSBridge.invoke(
                        'getBrandWCPayRequest',
                        {$payment_html},
                        function(res){
                                // WeixinJSBridge.log(res.err_msg);
                                // alert(res.err_code+res.err_desc+res.err_msg);


                                if(res.err_msg == "get_brand_wcpay_request:ok"){
                //alert(res.err_code+res.err_desc+res.err_msg);
                window.location.href="http://www.aaa.com/travel/wxpay_success/";
                exit();
            }else{
                //返回跳轉到訂單詳情頁面
                alert(支付失敗);
                window.location.href="http://www.aaa.com/travel/wxpay_fail/";
                exit();
            }
                        }
                );
        }


        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>
<div align="center">
        <button style="width:210px; height:50px; border-radius: 15px;background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer;  color:white;  font-size:16px;" type="button" onclick="callpay()" >立即支付</button>
</div>


Good luck and enjoy it~