导语
支付宝和微信,在目前的生态下,都得集成接入
开发前请申请认证微信公众号,申请开通微信商户
环境:
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~