**
淺談安卓微信支付遇到的那些坑(服務端簽名)
**
做微信支付首先需要到微信開放平台https://open.weixin.qq.com注冊自己的APP。
1,如果是建立移動應用就點選建立移動應用,然後安照提示的填寫資料。
2,第一頁填寫完畢後,會跳到填寫平台資訊頁面,(這裡會遇到第一個坑,我表示沒有遇到)這裡有個填寫應用簽名,注意了,如果項目是在測試階段,這裡填寫你的debug.keystore的簽名,如果不填寫這個到時候測試的時候很麻煩,記得這裡填寫測試的簽名。
3,申請通過後騰訊會給一個AppID,和AppSecret,拿到這個東西之後就可以進行微信支付API的內建了。
4,下面坑來了, 內建微信支付很簡單,但是難得地方是文檔寫的不夠清晰,總是會讓人掉到坑裡面去, 內建微信支付首先到微信開放下載下傳微信支付的DEMOhttps://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1,下載下傳完之後就可以正式移植微信支付API了,

而真正有用的隻有
5,調用微信支付API ,調用微信支付首先要将自己的APP注冊到微信 ,即要調用`
final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
// 将該app注冊到微信
msgApi.registerApp(Constants.APP_ID);`
然後建立IWXAPI對象,
IWXAPI api = WXAPIFactory.createWXAPI(this, "wxb4ba3c02aa476ea1");
然後調用微信建立支付訂單方法
PayReq req = new PayReq();
//req.appId = "wxf8b4f85f3a794e77"; // 測試用appId
req.appId= "appid";
req.partnerId= "partnerid";
req.prepayId= json.getString("prepayid");
req.nonceStr= json.getString("noncestr");
req.timeStamp= json.getString("timestamp");
req.packageValue= json.getString("package");
req.sign= json.getString("sign");
req.extData= "app data"; // optional
// 在支付之前,如果應用沒有注冊到微信,應該先調用IWXMsg.registerApp将應用注冊到微信
api.sendReq(req);
注意:以上參數是通過伺服器簽名後傳遞過來的,
6.将如下目錄的包拷至自己項目的主目錄下面
,即 配置檔案的package裡面的那個目錄,這個是重點,而且這個包的名字也不可以改變,必須是wxapi,否則是無法接收到微信支付狀态的回調的,調試起來非常的麻煩, 這裡面的兩個檔案WXPayEntryActivity.java是支付狀态的回調檔案,一定要記住,wxapi包必須是要放在項目的主目錄裡面,至此微信支付的用戶端已經內建完畢。
7.服務端的一個,
(注意服務端會有一個坑),當服務端簽名後傳遞到本地APP後如果無法調起微信支付頁面,而且一直傳回-1的話,那麼看服務端時候拿到了微信給的簽名,服務端傳過來的參數是否有空值,并且要拿微信的線上參數測試工具測試一下參數是否配置正确,如果正确依然無法支付傳回-1的話那麼就是服務端沒有進行二次簽名了,當服務端在第一次向微信請求簽名的時候,微信傳回的簽名值并不是傳遞給安卓端的簽名,服務端拿到簽名後要将這個簽名拿到第一次向微信簽名的參數進行二次簽名後傳遞給安卓端,這才是正确的簽名,需要二次簽名,至此微信支付完成。
如果調用微信支付并且簽名正确依然沒有反應的話那麼首先檢查wxapi的包是否放在項目的主目錄下面, 然後檢查服務端是否進行二次簽名,
還有一個坑,當服務端進行第一次簽名時會向微信傳遞一個BODY參數,這個參數一旦生成簽名成功,當支付失敗再次進行支付時不可以改變BODY的内容,因為這個正文是不可以改變的,
這就是我做微信遇到的坑,希望對大家有幫助,第一次寫文章,寫的不好請大家諒解,如果遇到問題可以加我的QQ:847874028 幫助解答,謝謝!