真是無力吐槽這個需求了,好端端的非要在微信公衆號接入支付寶,都知道微信公衆號是拒絕支付寶的,屏蔽了支付寶,所以在微信公衆號接入支付寶的話就必須手動複製鏈接跳出微信內置瀏覽器,強制性打開web瀏覽器完成支付,這是很坑的,只能選擇千百度各種查找答案啊,發現沒有一個php做的 更別說用TP框架了,之前做APP支付寶支付,PC掃碼支付都是一天完成的,這個公衆號支付煩死了,下面具體分享一下我用Thinkphp5.0做微信公衆號接入支付寶的代碼以及過程(看不到圖片的請用電腦訪問,肯定已經解決了,把坑踩完了)。
首先登錄支付寶開發者平臺申請接入了,如下圖:
創建應用查看,添加APP支付功能,需要簽約上線,如圖:
好了,然後主要是解決微信公衆號接入支付寶功能,這個可以參考支付寶開發文檔/手機網站支付/快速接入/使用SDK快速接入這個文檔裏面微信公衆平臺無法使用支付寶收付款解決方案所述來實現,基於這個的。裏面有demo,我就是下載的這個來實現的。
還有一個demo也要下載,點擊這裏查看,需要調用支付寶接口,如下圖:
下載微信公衆號接入支付寶參考demo後解壓可以看到有五個文件,如圖:
本人主要用到了demo_get.htm和pay.htm,加上ap.js來實現的,pdf僅做參考,可以看一下(重點來了)。
首先走流程到選擇支付頁面:
這裏選擇支付寶啦,點擊支付post傳遞訂單信息調用pay_order方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
public function pay_order(){
$res = new OrderGoods();
//獲取訂單號
$where [ 'id' ] = input( 'post.order_sn' );
$reoderSn = input( 'post.order_sn' );
//查詢訂單信息
$order_info = $res ->where( $where )->find();
//獲取支付方式
$pay_type = input( 'post.pay_type' ); //微信支付 或者支付寶支付
//獲取支付金額
$money = input( 'post.totle_sum' );
$order_id = input( 'post.order_id' );
//判斷支付方式
switch ( $pay_type ) {
case 'ali' ; //如果支付方式爲支付寶支付
$this ->redirect( 'index.php/mobile/Alipay/alipay' ,[ '$reoderSn' => $order_id ]);
break ;
case 'wx' ;
//更新支付方式爲微信
$this ->redirect( 'index.php/mobile/Wxpay/js_api_call' ,[ 'order_id' => $order_id ]);
break ;
}
}
|
這裏選擇支付寶支付,我在這裏進行了重定向,GET一個參數訂單ID。
到Alipay控制器然後就開始接入支付寶,用剛纔下載的demo:
這個是demo大致目錄
主要用到的裏面的pay.php(在demo中配置config文件,引入)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
public function alipay( $reoderSn =null, $status =null){
vendor( 'alipaywx.config' );
vendor( 'alipaywx.wappay.service.AlipayTradeService' );
vendor( 'alipaywx.wappay.buildermodel.AlipayTradeWapPayContentBuilder' );
//商戶訂單號,商戶網站訂單系統中唯一訂單號,必填
$out_trade_no = $_POST [ 'WIDout_trade_no' ];
//訂單名稱,必填
$subject = $_POST [ 'WIDsubject' ];
//付款金額,必填
$total_amount = $_POST [ 'WIDtotal_amount' ];
//商品描述,可空
$body = $_POST [ 'WIDbody' ];
//超時時間
$timeout_express = "1m" ;
$payRequestBuilder = new \AlipayTradeWapPayContentBuilder();
$payRequestBuilder ->setBody( $body );
$payRequestBuilder ->setSubject( $subject );
$payRequestBuilder ->setOutTradeNo( $out_trade_no );
$payRequestBuilder ->setTotalAmount( $total_amount );
$payRequestBuilder ->setTimeExpress( $timeout_express );
$payResponse = new \AlipayTradeService( $config );
$result = $payResponse ->wapPay( $payRequestBuilder , $config [ 'return_url' ], $config [ 'notify_url' ]);
return ;
}
|
然後進行支付發現是這樣的頁面:
這樣對用戶體驗是非常不友好的,只能選擇複製鏈接然後在瀏覽器打開進行支付,要解決這個問題,百度查看了好多解決辦法,都沒行得通,最後就用了官方文檔提供的demo,所以我在代碼裏做了修改:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
public function alipay( $reoderSn =null, $status =null){
vardor( 'alipaywx.config' );
vendor( 'alipaywx.wappay.service.AlipayTradeService' );
vendor( 'alipaywx.wappay.buildermodel.AlipayTradeWapPayContentBuilder' );
//商戶訂單號,商戶網站訂單系統中唯一訂單號,必填
$out_trade_no = $_POST [ 'WIDout_trade_no' ];
//訂單名稱,必填
$subject = $_POST [ 'WIDsubject' ];
//付款金額,必填
$total_amount = $_POST [ 'WIDtotal_amount' ];
//商品描述,可空
$body = $_POST [ 'WIDbody' ];
//超時時間
$timeout_express = "1m" ;
$payRequestBuilder = new \AlipayTradeWapPayContentBuilder();
$payRequestBuilder ->setBody( $body );
$payRequestBuilder ->setSubject( $subject );
$payRequestBuilder ->setOutTradeNo( $out_trade_no );
$payRequestBuilder ->setTotalAmount( $total_amount );
$payRequestBuilder ->setTimeExpress( $timeout_express );
$payResponse = new \AlipayTradeService( $config );
$result = $payResponse ->wapPay( $payRequestBuilder , $config [ 'return_url' ], $config [ 'notify_url' ]);
$this ->assign( 'result' , $result );
$this ->assign( 'order_sn' , $order_sn );
$this ->assign( 'total_amount' , $total_amount );
$this ->view->engine->layout(false);
return view( 'Pay/payInfo' );
}
|
是的,我調用支付寶接口拿到拼接的鏈接之後賦值到模板中了(注意!調用支付寶接口的時候相關類中構造請求路徑或參數的時候有兩種方式,GET和POST,post是form表單,這裏選擇GET方式拿到構造的URL!),然後進入到剛纔demo裏的demo_get.html頁面,部分代碼截圖:
把demo裏面a標籤中href中的demo鏈接替換成調用支付寶得到的請求鏈接,引入ap.js。點擊確認支付的時候會執行下面的js代碼中_AP.pay代碼調用ap.js中的pay的location.href路徑,同時會get傳遞一個參數goto:
此時傳遞參數跳入另外一個html就是pay.html了,在控制器中接受到這個參數賦值到模板中去:
1
2
3
4
5
6
|
public function pay( $goto =null){
// echo $goto;exit;
$this ->assign( 'goto' , $goto );
$this ->view->engine->layout(false);
return view();
}
|
我是把上個頁面_AP.pay傳遞的參數goto接收到然後賦值到pay視圖裏面了,pay視圖裏面我直接吧demo裏面pay.html的代碼拿了過來,把裏面的一些數據替換掉了,替換之前部分截圖:
把數據替換後部分截圖:
一定要引入ap.js,不然是不會成功的,現在在去支付一次,顯示如下:
怎樣,終於得到相要的了吧?瀏覽器打開後頁面顯示如下:
嘻嘻嘻。
現在已經實現了所需,以上只是給一個大致的參考,畢竟方法千千萬,實現這個功能的方法很多,希望以上步驟能給也遇到這種情況的碼友們一個新的思路,以上代碼什麼的寫的亂,只是demo而已,不喜勿噴。