Android App支付系列(一):微信支付接入詳細指南(附官方支付demo)_Android

來源:互聯網
上載者:User

寫在前面

一家移動互連網公司,說到底,要盈利總是需要付費使用者的,自己開發支付系統顯然是不明智的,國內已經有多家成熟的移動支付供應商,騰訊就是其中之一。梳理了下微信支付的接入,今天給大家分享下騰訊旗下的微信支付SDK的接入流程。
接入流程

1.申請開發人員資質

地址:https://open.weixin.qq.com/

使用公司管理者/高層帳號登入微信開放平台,進入“帳號中心”,進行開發人員資質認證,需要填寫公司資料,包括但不限於,公司註冊號,公司營業執照,公司對外辦公電話,公司對公銀行卡資訊(卡號,發卡行)。審核時間為一周左右。

備忘:因為從2015年10月1日起,國家實行三證(組織機構代碼證,企業營業執照,稅務登記證)合一,所以組織機構代碼處填寫-工商執照註冊號,同樣,組織機構代碼證,上傳-企業工商營業執照。

備忘2:進行開發人員資質認證需要支付300元人名幣/年,只有具備開發人員資質認證的開發人員才能夠使用app支付,授權登入等介面。

2.申請APP_ID/APP_KEY

每個應用/遊戲要調用微信的介面都需要有一個微信標誌,這個唯一標誌通常成為APP_ID或者APP_KEY,各開放平台差異不大
 進入管理中心,建立行動裝置 App,每個開發人員具有10個應用的建立機會,好在建立的應用可以隨時刪除。已上線的應用就不建議手賤刪除!! 

 申請appid需要填寫應用資訊:應用程式名稱,包名,簽名(keystore的md5值去分號小寫),icon(28*28 & 108*108),app下載地址等資訊,即可分配到一個appid。
 備忘:測試支付時,務必使用申請時填寫的keystore檔案簽名,包名也需要核對清楚,必然無法調起支付,返回-1錯誤碼。

3.申請支付能力 

 在管理中心,查看需要整合支付能力的app,找到“微信支付”一欄,點擊右側“申請開通”,填寫一些公司資訊後等待審核,審核時間為一周左右,審核通過後,會得到一個企業商戶號及密碼,對公銀行卡中將收到幾分錢,進入商戶平台,輸入收到的金錢金額以驗證。驗證通過後即可開始整合支付調用。在這之前,調用支付介面是無法完成支付的。

4.代碼整合微信支付 

支付流程圖

微信支付流程圖白話版:

1.用戶端代碼得到使用者購買的商品資訊,將之傳給自己公司app伺服器,參數包含但不限於以下:

params.put("appid", appID);// 微信appid,選擇性上傳,伺服器寫死亦可params.put("money", money);// 支付金額,單位:分params.put("name", goodsName);// 商品名稱params.put("currencytype", "CNY");// 支付幣種,只能填CNY,代表人民幣

備忘:以上是參數欄位是我們公司伺服器定義,給伺服器用以擷取預支付訂單號prePayId用。 

備忘2:詳細欄位請參考:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1 

2.app伺服器調用微信“統一下單”介面,得到prePayId訂單號並返回prePayId給手機用戶端;

3.手機用戶端使用prePayId及商品資訊調起微信用戶端進行支付;

3.1使用者操作:輸入密碼進行支付;返回鍵取消支付;網路無串連支付失敗等;

4.微信用戶端回調支付結果給咱們的APP用戶端;

5.微信伺服器非同步通知咱們公司app伺服器支付結果(伺服器的工作,與用戶端無關)

微信支付代碼:

IWXAPI mWxApi = WXAPIFactory.createWXAPI(mContext, WX_APPID, true);mWxApi.registerApp(WX_APPID);      /**       * 請求app伺服器得到的回調結果       */      @Override      public void onGet(JSONObject jsonObject) {        if (mWxApi != null) {          PayReq req = new PayReq();          req.appId = WX_APPID;// 微信開放平台審核通過的應用APPID          try {            req.partnerId = jsonObject.getString("partnerid");// 微信支付分配的商戶號            req.prepayId = jsonObject.getString("prepayid");// 預支付訂單號,app伺服器調用“統一下單”介面擷取            req.nonceStr = jsonObject.getString("noncestr");// 隨機字串,不長於32位,伺服器小哥會給咱產生            req.timeStamp = jsonObject.getString("timestamp");// 時間戳記,app伺服器小哥給出            req.packageValue = jsonObject.getString("package");// 固定值Sign=WXPay,可以直接寫死,伺服器返回的也是這個固定值            req.sign = jsonObject.getString("sign");// 簽名,伺服器小哥給出,他會根據:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3指導得到這個          } catch (JSONException e) {            e.printStackTrace();          }          mWxApi.sendReq(req);          Log.d("發起微信支付申請");        }      }

在app包下建立wxapi包,比如app包名為com.xiongit.app,那個建立的包路徑為com.xiongit.app.wxapi,該包下建立WXPayEntryActivity,繼承自任意Activity。該Activity用以接收支付結果回調,清單聲明此Activity的格式為

<activity    android:name=".wxapi.WXPayEntryActivity"    android:exported="true"    android:launchMode="singleTop"/>

WXPayEntryActivity程式碼範例

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{  private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";  private IWXAPI api;  private static final String APP_ID = "your app id";  @Override  public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.pay_result);    api = WXAPIFactory.createWXAPI(this, APP_ID);    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);// 支付結果碼  }}

回調中errCode值列表:

0 支付成功

-1 發生錯誤 可能的原因:簽名錯誤、未註冊APPID、項目設定APPID不正確、註冊的APPID與設定的不匹配、其他異常等。

-2 使用者取消 發生情境:使用者不支付了,點擊取消,返回APP。

清單menifest申明要求的權限

 <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"/>

備忘:支付結果最終以app伺服器的得到的非同步通知為準。

微信SDK混淆

-keep class com.tencent.mm.sdk.** {  *;}

update 20160704

當支付時,微信尚未登入,得不到任何回調,如果調起支付時有彈窗進度框,並且你想在得到響應碼後讓它消失是行不通的,需要在跳出的onStop中處理進度條,不然未登入並且使用者取消了支付時進度條無法消失。

update 20160722

當支付時,WXPayEntryActivity會以透明的形式啟動,所以你可能需要在支付完成得到支付響應碼後手動finish該activity,不然你自己寫的支付頁面的activity需要返回兩次才能退出,因為第一次按下back鍵實際是finish掉WXPayEntryActivity.第二次才是你自己的activity.

完事了,祝各位整合微信支付成功!

最後附上微信官方支付demo下載:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1,吐槽語:官方demo下載藏的有點深。。。開放平台居然沒有提供下載,放在微信支付商戶平台。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.