真是無力吐槽這個需求了,好端端的非要在微信公衆號接入支付寶,都知道微信公衆號是拒絕支付寶的,屏蔽了支付寶,因此在微信公衆號接入支付寶的話就必須手動複製連接跳出微信內置瀏覽器,強制性打開web瀏覽器完成支付,這是很坑的,只能選擇千百度各類查找答案啊,發現沒有一個php作的 更別說用TP框架了,以前作APP支付寶支付,PC掃碼支付都是一天完成的,這個公衆號支付煩死了,下面具體分享一下我用Thinkphp5.0作微信公衆號接入支付寶的代碼以及過程(看不到圖片的請用電腦訪問,確定已經解決了,把坑踩完了)。php
首先登陸支付寶開發者平臺申請接入了,以下圖:html
建立應用查看,添加APP支付功能,須要簽約上線,如圖:web
好了,而後主要是解決微信公衆號接入支付寶功能,這個能夠參考支付寶開發文檔/手機網站支付/快速接入/使用SDK快速接入這個文檔裏面微信公衆平臺沒法使用支付寶收付款解決方案所述來實現,基於這個的。裏面有demo,我就是下載的這個來實現的。express
還有一個demo也要下載,點擊這裏查看,須要調用支付寶接口,以下圖:api
下載微信公衆號接入支付寶參考demo後解壓能夠看到有五個文件,如圖:瀏覽器
本人主要用到了demo_get.htm和pay.htm,加上ap.js來實現的,pdf僅作參考,能夠看一下(重點來了)。微信
首先走流程到選擇支付頁面:app
這裏選擇支付寶啦,點擊支付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而已,不喜勿噴。
本文屬原創內容,爲了尊重他人勞動,轉載請註明本文地址: