THINKPHP 3.1.x 整合微信支付
阿新 • • 發佈:2018-12-31
導語
支付寶和微信,在目前的生態下,都得整合接入
開發前請申請認證微信公眾號,申請開通微信商戶
環境:
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~