您的位置:首页 > 编程语言 > PHP开发

THINKPHP 3.1.x 集成微信支付

2015-06-10 17:43 741 查看
导语

支付宝和微信,在目前的生态下,都得集成接入

开发前请申请认证微信公众号,申请开通微信商户

环境:

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~ 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息