手把手教你android端微信支付接入
Android端接入微信支付,蠻簡單的
一、新增gradle依賴:
在app module目錄下的build.gralde中新增
dependencies { //微信SDK接入 implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+' }
gralde構建完成之後,再做下一步的操作。
二、在AndroidManifest.xml中新增相關許可權:
<!--微信支付許可權--> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
三、建立wxapi目錄,並建立WXPayEntryActivity
在你的package目錄下,建立 wxapi 目錄,比如說我使用的demo專案, wxapi 就在目錄 net.sourceforge.simcpux 目錄下
同時,在 wxapi 目錄下建立 WXPayEntryActivity

wxpay-001.png
WXPayEntryActivity實現 IWXAPIEventHandler 介面,這個Activity頁面就是支付結果的回撥頁面,下面是它最簡單地實現:
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{ private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity"; private IWXAPI api; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.pay_result); api = WXAPIFactory.createWXAPI(this, "你的appid"); api.handleIntent(getIntent(), this); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); api.handleIntent(intent, this); } @Override public void onReq(BaseReq req) { } @Override public void onResp(BaseResp resp) { Log.d(TAG, "onPayFinish, errCode = " + resp.errCode); if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("支付結果"); builder.setMessage(getString(R.string.pay_result_callback_msg, String.valueOf(resp.errCode))); builder.show(); } } }
同時,別忘了在 AndroidManifest.xml 中聲名 WXPayEntryActivity
<activity android:name=".wxapi.WXPayEntryActivity" android:exported="true" android:launchMode="singleTop"> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="你的appid"/> </intent-filter> </activity>
當這些準備工作都做好之後,就可以準備使用了。
四、使用
當你從服務端獲取到訂單的相關資訊後,就可以呼叫支付介面了:
IWXAPI api = WXAPIFactory.createWXAPI(context, null); api.registerApp(IntentKey.WX_APP_ID); PayReq req = new PayReq(); req.appId= "wx8888888888888888";//你的微信appid req.partnerId= "1900000109";//商戶號 req.prepayId= "WX1217752501201407033233368018";//預支付交易會話ID req.nonceStr= "5K8264ILTKCH16CQ2502SI8ZNMTM67VS";//隨機字串 req.timeStamp= "1412000000";//時間戳 req.packageValue= "Sign=WXPay";擴充套件欄位,這裡固定填寫Sign=WXPay req.sign= "C380BEC2BFD727A4B6845133519F3AD6";//簽名 //req.extData= "app data"; // optional // 在支付之前,如果應用沒有註冊到微信,應該先呼叫IWXMsg.registerApp將應用註冊到微信 api.sendReq(req);
這裡需要注意的是,上面的這些資訊,都應該從伺服器去獲取,比如說隨機字串之類的長短也不一定和上面例子中的一致。具體是什麼,得看你們的後端給的是什麼。
不出意外的話,通過上面介面的呼叫,你就可以正常使用微信提供的APP支付了。
是不是非常簡單?!
然鵝。。。
事情哪兒有這麼順利,到了真正使用的時候,遇到的問題可不少,下面會列舉出遇到過的問題,然後說明解決辦法。
Android端接入微信支付,坑蠻多的
微信支付app的接入,要我來說,對初次嘗試的人非常不友好
一般情況下,開發者使用新的工具都需要先看一看它的說明文件,如果說明文件寫的夠好,直接用就是了;如果文件介紹的不夠全面,還需要有Demo提供參考。微信的App支付就屬於後者。
下面是它的接入文件頁面:
ofollow,noindex">Android接入指南 (還有其他相關資訊也可以通過這個頁面接入)
由於僅僅靠著文件的說明不足以讓我掌握對微信支付的使用,所以自然而然的,Demo就成了初次接觸微信支付者的學習教材啦!
當你接入Demo後,一系列的問題將會接踵而至,下面來看一看具體是什麼問題
接入Demo
將下載後的Demo按照Import moudule的方式接入到某個專案中:

wxpay-002.png
然後選中這個專案,進行編譯:

wxpay-003.png
接下來,編譯器就開始報錯了,找到報錯的位置,發現是如下問題:

wxpay-004.png
到這裡開始,我就要吐槽了
這種問題一看就是找不到包了,於是我們看一下這個專案中的build.gralde中的依賴,如下
dependencies { compile files('libs/libammsdk.jar') compile files('libs/wechat-sdk-android-with-mta-1.0.2.jar') }
很顯然,是匯入的本地jar包,為了方便起見,我們將這裡的依賴修改成之前配置時的:
dependencies { //微信SDK接入 implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+' }
同時,我們還可以發現,重新構建完專案後,上面的問題並沒有解決。
這時候我們在Android studio的中的 External Libraries 去看一看新構建的庫:

wxpay-005.png
可以看到,正確的引用路徑應該是把 sdk 換成 opensdk

wxpay-006.png
當你將所有的路徑都修改過來後,還會有如下問題:

wxpay-007.png
將上面的 imgObj.imageUrl = url 修改為:
imgObj.setImagePath(url);
這個錯誤出現的地方有兩處吧,當你把這些錯誤都解決後,再次進行編譯,就可以正常執行啦!
Demo執行後的介面是這樣的:

wxpay-008.png
到了這裡,基本上就可以進行測試了,剩下的東西無需再多說,過程差不多和上面直接接入的流程一樣,不過要demo裡面的更加詳細,只需多多觀摩即可。
那麼,最後還是說一下需要注意的點吧。
注意事項
在微信開放平臺上面設定app相關引數的時候,需要 應用包名 以及 應用簽名

image
獲取應用簽名的工具地址是: 簽名工具下載地址
這裡又要吐槽一下,簽名工具就是一個apk,裝到手機上後,輸入包名,然後生成簽名,最關鍵的是這個簽名無法複製,使用下來就一個感受,不方便啊!!!!
簽名工具裡面輸入的包名就是之前提到過的,可以直接在Androidmanifest.xml中複製。
但是
儘管包名一樣,release版的專案和debug版的專案最後生成的簽名都是不一樣的,這點很重要!
所以如果你是用的debug進行測試,那麼網站裡面的簽名一定要填寫debug版下獲取到的簽名,正式釋出的時候,要把它換成release版的!如果簽名不一致,你是無法通過那個“-1”返回值獲取到任何有效的錯誤資訊的!切記!
那麼

wxpay-009.png