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" οnclick="callpay()" >立即支付</button>
</div>


Good luck and enjoy it~ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值