開始介紹之前,首先補(bǔ)充說明一下微信支付的幾種方式:
1、刷卡支付
刷卡支付是用戶展示微信錢包內(nèi)的“刷卡條碼/二維碼”給商戶系統(tǒng)掃描后直接完成支付的模式。主要應(yīng)用線下面對(duì)面收銀的場(chǎng)景。
2、掃碼支付
掃碼支付是商戶系統(tǒng)按微信支付協(xié)議生成支付二維碼,用戶再用微信“掃一掃”完成支付的模式。該模式適用于PC網(wǎng)站支付、實(shí)體店單品或訂單支付、媒體廣告支付等場(chǎng)景。
公眾號(hào)支付是用戶在微信中打開商戶的H5頁面,商戶在H5頁面通過調(diào)用微信支付提供的JSAPI接口調(diào)起微信支付模塊完成支付。應(yīng)用場(chǎng)景有:
◆ 用戶在微信公眾賬號(hào)內(nèi)進(jìn)入商家公眾號(hào),打開某個(gè)主頁面,完成支付
◆ 用戶的好友在朋友圈、聊天窗口等分享商家頁面連接,用戶點(diǎn)擊鏈接打開商家頁面,完成支付
◆ 將商戶頁面轉(zhuǎn)換成二維碼,用戶掃描二維碼后在微信瀏覽器中打開頁面后完成支付
4、APP支付
APP支付又稱移動(dòng)端支付,是商戶通過在移動(dòng)端應(yīng)用APP中集成開放SDK調(diào)起微信支付模塊完成支付的模式。
本次開發(fā)為一款基于Android系統(tǒng)的自助收銀項(xiàng)目,為線下支付場(chǎng)景,故使用 刷卡支付 的方式。
首先要說的是,刷卡支付不同于APP支付,是要在 微信公眾平臺(tái) 申請(qǐng)并審核信息的。
微信公眾平臺(tái) (https://mp.weixin.qq.com/)
微信刷卡支付開發(fā)文檔 (https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=2_1)
好了,以上為篇外信息,以下才是開發(fā)中的重點(diǎn):
微信刷卡支付開發(fā)文檔中提供的SDK和Demo是java版的,也就是說,是服務(wù)器版本項(xiàng)目代碼,并非Android項(xiàng)目。所以說,如果想方便開發(fā),應(yīng)在后臺(tái)實(shí)現(xiàn)支付功能的前提下,Android端只需要使用接口提供參數(shù)就可以了。但是,如果沒有后臺(tái),想讓Android項(xiàng)目實(shí)現(xiàn)整個(gè)流程怎么辦 。。。移植修改sdk的代碼!這就是本文的中心。
用studio打開demo后(編譯不了),重點(diǎn)在兩個(gè)類,WXPay 和 ScanPayBusiness。前者是初始化參數(shù),包括 在公眾平臺(tái)上申請(qǐng)的key、appID、mchID等信息,還有就是證書(.p12格式),微信支付采用的https。后者為整個(gè)被掃支付業(yè)務(wù)邏輯,邏輯無需調(diào)整,直接copy過來即可。需要移植的代碼如下:

對(duì)了,還有重要一點(diǎn),demo中的網(wǎng)絡(luò)請(qǐng)求是httpclient,但Android現(xiàn)在已經(jīng)不推薦使用了,故需要使用自己的網(wǎng)絡(luò)框架。本項(xiàng)目采用的Retrofit。說到這兒,就需要排一下坑了,有關(guān)于.p12格式證書解析的。網(wǎng)上有關(guān)這個(gè)問題的回答不多,而且每個(gè)都不太相同,除了一點(diǎn):都YD沒用?。?!本人嘗試了很多種方法,都沒在Android代碼中解析成功。最后 ,,,怎么調(diào)試成功的我也忘了,反正有一點(diǎn)結(jié)論:在java服務(wù)器解析證書的代碼跟Android上的有微小區(qū)別。直接上代碼:

網(wǎng)絡(luò)代碼調(diào)試完畢后,只需要在 ScanPayBusiness 的 run 方法中找到相關(guān)網(wǎng)絡(luò)操作,替換掉就可以了。
整個(gè)被掃支付涉及三個(gè)接口:提交刷卡支付、查詢訂單、撤銷訂單。
最后,補(bǔ)充一些小東西:
1. 當(dāng)調(diào)試 提交刷卡支付接口 過程中,若返回訂單信息有誤先關(guān)錯(cuò)誤碼??山栌?a target="_blank" rel="nofollow">支付接口調(diào)試工具 。對(duì)比生成的簽名和自己log信息中生成的簽名是否一致,若不一致則代碼有問題。排坑:檢查一下數(shù)據(jù)bean生成簽名的時(shí)候,打印bean.toMap會(huì)發(fā)現(xiàn)莫名其妙的多了一個(gè)字段:serialVersionUID 序列化ID。
2. 微信付款碼規(guī)則: https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=5_1
??? 用戶刷卡條形碼規(guī)則:18位純數(shù)字,以10、11、12、13、14、15開頭
???? 支付寶付款碼規(guī)則:https://support.open.alipay.com/support/announcementDetail.htm?spm=a219a.7386793.0.0.5MK6mY&id=25251
? 支付寶將會(huì)在2017年9月底對(duì)支付寶的用戶付款碼做升級(jí)處理。付款碼將由原來的28開頭擴(kuò)充到25-30開頭,長度由原來的? 16-18位擴(kuò)充到16-24位。
???? 第一次寫文章,肯定有眾多不足,請(qǐng)見諒 ~