android微信支付詳解與坑

要想在自己的APP中實現(xiàn)APP支付必須申請開通支付功能,這些按著文檔來吧,我還是直接說Android中的問題吧。

一、簽名

一定要在開放平臺為自己的APP配置正確的包名和簽名(簽名:將APP打一個正式環(huán)境的包,然后在微信開放平臺下載簽名工具進行簽名)。

二、打包測試

和微信的第三方登錄一樣,必須要打正式包,不是debug的,來進行測試,這樣就沒有辦法調(diào)試了,感覺很不爽。所以提供一個辦法來拯救一下嘿嘿:
在build.gradle文件中設置debug環(huán)境和relealse環(huán)境的簽名相同就可以解決這個文通了,已經(jīng)試過了,可以的。

 signingConfigs {

        release {
            //.jks文件放在項目目錄
            storeFile file("xxx.jks")
            storePassword "xxx"
            keyAlias "xxx.release"
            keyPassword "xxx"
        }
        debug {
            //.jks文件放在項目目錄
            storeFile file("xxx.jks")
            storePassword "xxx"
            keyAlias "xxx.release"
            keyPassword "xxx"
        }
    }

接下來按著官網(wǎng)的文檔和demo來完成:

1、定義一個全局的變量:

private IWXAPI api;

2、注冊APPID

api = WXAPIFactory.createWXAPI(this, "你在微信開放平臺創(chuàng)建的app的APPID");

官網(wǎng)是這樣注冊的,但是,下面要用到msgAPi,所以定義為全局的。

final IWXAPI msgApi = WXAPIFactory.createWXAPI(SelectPaymentMethodActivity.this, null);
msgApi.registerApp("你在微信開放平臺創(chuàng)建的app的APPID");


3、開始支付

當你點擊支付的時候去調(diào)用服務端的接口(服務端調(diào)用統(tǒng)一下單接口,反geini一些信息),所以這里你不能自己獨立完成需要后端的支持。

//我將后端反給我的信息放到了WeiXinPay中,這步是獲取數(shù)據(jù)

WeiXinPay weiXinPay = (WeiXinPay) map.get("weixinpay");

//這個在官網(wǎng)里就會看到,將你獲取的信息賦給payReq,這塊就是調(diào)起微信的關鍵

PayReq payReq = new PayReq();
payReq.appId = weiXinPay.getAppid();
payReq.partnerId = weiXinPay.getPartnerid();
payReq.prepayId = weiXinPay.getPrepayid();
payReq.packageValue = weiXinPay.getPackage_exten();
payReq.nonceStr = weiXinPay.getNoncestr();
payReq.timeStamp = weiXinPay.getTimestamp();
payReq.sign = weiXinPay.getSign();
api.sendReq(payReq);

4、接下來就是在微信里的一些東西了,我們不用管,我們只需要關心回調(diào)頁WXPayEntryActivity,這里需要注意該文件必須在wxapi這個文件夾下,及com.xxx.xxx.wxapi.WXPayEntryActivity

//必須實現(xiàn)接口,重寫方法
public class WXPayEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {

    private IWXAPI api;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wxpayentry);
        api = WXAPIFactory.createWXAPI(this, "wx72e0123dd9b54a73");
        api.handleIntent(getIntent(), this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
    }

    @Override
    public void onReq(BaseReq baseReq) {

    }

    @Override
    public void onResp(BaseResp baseResp) {
        Log.e("---------->","code:"+baseResp.errCode);

        if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            //這里就是支付完成后需要做的事,如跳到哪個頁面啥的
        }
    }
}

5、還有一點在功能清單中對Activity中進行注冊

 <!--微信支付-->
 <activity android:name=".wxapi.WXPayEntryActivity"
           android:exported="true"
           android:launchMode="singleTop"/>




-1 掃坑(可能的原因:簽名錯誤、未注冊APPID、項目設置APPID不正確、注冊的APPID與設置的不匹配、其他異常等)


微信

商戶系統(tǒng)和微信支付系統(tǒng)主要交互說明:

  • 步驟1:用戶在商戶APP中選擇商品,提交訂單,選擇微信支付。
  • 步驟2:商戶后臺收到用戶支付單,調(diào)用微信支付統(tǒng)一下單接口。參見【統(tǒng)一下單API】。
  • 步驟3:統(tǒng)一下單接口返回正常的prepay_id,再按簽名規(guī)范重新生成簽名后,將數(shù)據(jù)傳輸給APP。參與簽名的字段名為appid,partnerid,prepayid,noncestr,timestamp,package。注意:package的值格式為Sign=WXPay
  • 步驟4:商戶APP調(diào)起微信支付。api參見本章節(jié)【app端開發(fā)步驟說明
  • 步驟5:商戶后臺接收支付通知。api參見【支付結果通知API
  • 步驟6:商戶后臺查詢支付結果。,api參見【查詢訂單API

調(diào)起支付接口

請求參數(shù)

字段名 變量名 類型 必填 示例值 描述
應用ID appid String(32) wx8888888888888888 微信開放平臺審核通過的應用APPID
商戶號 partnerid String(32) 1900000109 微信支付分配的商戶號
預支付交易會話ID prepayid String(32) WX1217752501201407033233368018 微信返回的支付交易會話ID
擴展字段 package String(128) Sign=WXPay 暫填寫固定值Sign=WXPay
隨機字符串 noncestr String(32) 5K8264ILTKCH16CQ2502SI8ZNMTM67VS 隨機字符串,不長于32位。推薦隨機數(shù)生成算法
時間戳 timestamp String(10) 1412000000 時間戳,請見接口規(guī)則-參數(shù)規(guī)定
簽名 sign String(32) C380BEC2BFD727A4B6845133519F3AD6 簽名,詳見簽名生成算法注意:簽名方式一定要與統(tǒng)一下單接口使用的一致

舉例請見:APP端開發(fā)說明

返回結果

名稱 描述 解決方案
0 成功 展示成功頁面
-1 錯誤 可能的原因:簽名錯誤、未注冊APPID、項目設置APPID不正確、注冊的APPID與設置的不匹配、其他異常等。
-2 用戶取消 無需處理。發(fā)生場景:用戶不支付了,點擊取消,返回APP。

幾大坑原因+解決:

  • 1、 微信開放平臺上傳的簽名問題(調(diào)試環(huán)境使用的簽名要和微信后臺保持一致)
  • 2、 Manifest文件中WXPayEntryActivity 的配置問題。一定要聲明
  • 3、 WXPayEntryActivity 類必須放在 包名.wxapi 下
  • 4、 簽名工作一般由后臺完成,在生成簽名時,務必注意key的拼寫問題,比如必須拼appid而不是appId,必須拼prepayid而不是prepayId,這里跟上面PayReq 對象中字段的命名方式不一樣,用錯了也是照樣返回-1。一定要小寫!!!參與簽名的字段名為appid,partnerid,prepayid,noncestr,timestamp,package。注意:package的值格式為Sign=WXPay
  • 5、簽名所使用的是 微信商戶平臺API密鑰,而不是微信開放平臺AppSecret。 API密鑰在商戶平臺后臺-->API安全-->先安裝操作證書,后設置密鑰
  • 6、清空緩存,最后再說一個坑,如果經(jīng)過一系列的配置,發(fā)現(xiàn)完全都配置好了,可是微信支付依然返回-1。而此時我們可能又會回頭排查各個節(jié)點的問題,是配置問題?是自己的數(shù)據(jù)傳遞問題?到底哪里的bug?
    其實這時候,清空下自己的應用緩存就可以了,通過 設置-應用管理-your app-清空緩存,進行緩存清理過后,立竿見影拿到成功的回調(diào)!

參考文檔:

微信支付申請流程
微信支付簽名的配置
微信支付步驟
微信支付與坑
微信支付失敗-1徹底掃坑

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容