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 用于发起支付信息
WxnotifyModel.class.php
增加WxpayAction.class.php用于notify或跳转
最后在订单生成页调用以上model发起支付
扫码支付直接显示model中生成的html
JSAPI支付需要WeixinJSBridge类发起,如以下代码
Good luck and enjoy it~
支付宝和微信,在目前的生态下,都得集成接入
开发前请申请认证微信公众号,申请开通微信商户
环境:
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~
相关文章推荐
- 一个关于if else容易迷惑的问题
- PHP5.2.*防止Hash冲突拒绝服务攻击的Patch
- 深入理解PHP之匿名函数
- JSP/PHP基于Ajax的分页功能实现
- 关于PHP通过PDO用中文条件查询MySQL的问题。
- 什么是设计模式
- PHP数据库长连接mysql_pconnect的细节
- kindeditor 批量上传 上传失败 thinkphp swfupload session
- Php Installing An Expansion
- PHP+Apache在Windows 9x下的安装和配置
- IIS 6 的 PHP 最佳配置方法
- 安装Apache和PHP的一些补充
- Linux Apache+MySQL+PHP
- 建立Apache+PHP+MySQL数据库驱动的动态网站
- PHP 5.3.0 安装分析心得
- apache 环境下 php 的配置注意事项
- ASP.NET、ASP、PHP、JSP之间有什么区别?
- PHP VBS JS 函数 对照表
- C语言实现的统计php代码行数功能源码(支持文件夹、多目录)