Android接入支付SDK

lsyh0673 8年前發布 | 12K 次閱讀 安卓開發 Android開發 移動開發

最近公司項目做到支付模塊,之前也做過,沒整理成博客,這次整理一下。

微信支付

前期準備

  1. 注冊賬號,創建應用,開通微信支付。
  2. 查看APP支付文檔: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1
  3. 了解支付流程:

接入SDK

  1. 引入libs,下載 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1 ,并將libammsdk.jar放到libs文件夾下。
  2. 配置簽名
    在debug下直接配置key,這樣就可以在debug下調試了。
    signingConfigs {
         debug {
             storeFile file("你的keystore文件路徑")
             storePassword "xxx"
             keyAlias "xxx"
             keyPassword "xxx"
         }
         release {
             storeFile file("你的keystore文件路徑")
             storePassword "xxx"
             keyAlias "xxx"
             keyPassword "xxx"
         }
    }
    buildTypes {
         debug {
             signingConfig signingConfigs.debug
         }
         release {
             signingConfig signingConfigs.release
         }
     }
  3. 創建WXPayEntryActivity
    在報名下創建如下圖的Activity,demo里也有,WXPaEntryActivity是支付的回調,WXEntryActivity是微信登錄和分享的回調。

  4. AndroidManifest.xml中注冊
    <activity
     android:name=".wxapi.WXPayEntryActivity"
     android:exported="true"
     android:launchMode="singleTop"
     android:screenOrientation="portrait"
     android:theme="@android:style/Theme.Translucent.NoTitleBar"
     android:windowSoftInputMode="stateHidden"/>
  5. 加入混淆
    -libraryjars libs/libammsdk.jar
    -keep class com.tencent.** { *;}

接口調用

/**
 * 調用微信支付
 * @param datas 微信支付數據
 */
private void toWXPay(String datas) {
    IWXAPI api = WXAPIFactory.createWXAPI(PayActivity.this, WX_APP_ID);
    api.registerApp(WX_APP_ID);
    try {
        JSONObject jsonObject = new JSONObject(datas);
        PayReq req = new PayReq();
        req.appId = jsonObject.getString("appid");// 微信開放平臺appid
        req.nonceStr = jsonObject.getString("noncestr");// 隨機字符串
        req.packageValue = jsonObject.getString("package");// 支付內容
        req.partnerId = jsonObject.getString("partnerid");// 財付通id
        req.prepayId = jsonObject.getString("prepayid");// 微信預支付編號
        req.sign = jsonObject.getString("sign");// 簽名
        req.timeStamp = jsonObject.getString("timestamp");// 時間戳
        req.extData = "app data"; // optional
        // 在支付之前,如果應用沒有注冊到微信,應該先調用IWXMsg.registerApp將應用注冊到微信
        api.sendReq(req);
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

支付回調

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {

    private IWXAPI api;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        api = WXAPIFactory.createWXAPI(this, Config.WX_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) {
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            switch (resp.errCode) {
                case 0:
                    Toast.makeText(this, "支付成功", Toast.LENGTH_SHORT).show();
                    break;
                case -1:
                    Toast.makeText(this, "支付失敗,請檢查", Toast.LENGTH_SHORT).show();
                    break;
                case -2:
                    Toast.makeText(this, "已取消支付", Toast.LENGTH_SHORT).show();
                    break;
                default:
                    Toast.makeText(this, "支付失敗,請檢查", Toast.LENGTH_SHORT).show();
                    break;
            }
            finish();
        }
    }
}

遇到的問題

  1. 未安裝微信客戶端的情況下使用,然后會發現提示 E/ActivityThread: Failed to find provider info for com.tencent.mm.sdk.plugin.provider ,因為微信沒有html5頁面能使用支付,所以我們必須要在使用支付之前做個判斷,因為微信sdk有提供個參數可以判斷,所以應該加上:

    private boolean isWXAppInstall() {
         IWXAPI api = WXAPIFactory.createWXAPI(PayActivity.this, WX_APP_ID);
         api.registerApp(WX_APP_ID);
         boolean isWXAppInstalled = api.isWXAppInstalled() && api.isWXAppSupportAPI();
         return isWXAppInstalled;
    }
    if (isWXAppInstall()) {
     DialogUtil.showProDialog(PayActivity.this);
     toWXPay(datas);
    } else {
     Toast.makeText(this, "未安裝微信客戶端", Toast.LENGTH_SHORT).show();
    }
  2. Android7.0上會出現回調成功重復多次,這個待再次確認,可能是微信的bug。

支付寶支付

前期準備

  1. 注冊賬號,創建應用,開通支付功能。
  2. 查看文檔: 支付文檔
  3. 了解支付流程:

接入SDK

  1. 引入libs,下載 支付寶SDK及DEMO ,并將alipaySdk-xx.jar包放到libs文件夾下
  2. AndroidManifest.xml中注冊
    <activity
     android:name="com.alipay.sdk.app.H5PayActivity"
     android:configChanges="orientation|keyboardHidden|navigation"
     android:exported="false"
     android:screenOrientation="behind"/>
    <activity
     android:name="com.alipay.sdk.auth.AuthActivity"
     android:configChanges="orientation|keyboardHidden|navigation"
     android:exported="false"
     android:screenOrientation="behind"/>
  3. 加入權限
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  4. 加入混淆
    -libraryjars libs/alipaySdk-xx.jar
    -keep class com.alipay.android.app.IAlixPay{*;}
    -keep class com.alipay.android.app.IAlixPay$Stub{*;}
    -keep class com.alipay.android.app.IRemoteServiceCallback{*;}
    -keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
    -keep class com.alipay.sdk.app.PayTask{ public *;}
    -keep class com.alipay.sdk.app.AuthTask{ public *;}

    接口調用

    支付寶的demo已經寫得很明了易懂了,這里簡單列出接口調用的主要代碼,其他代碼請看支付寶DEMO。
    /**
    * 調取支付寶SDK
    *
    * @param payInfo 支付信息
    */
    private void alipay(final String payInfo) {
     Runnable payRunnable = () -> {
         PayTask alipay = new PayTask(PayActivity.this);
         String result = alipay.pay(payInfo, true);
         Message msg = new Message();
         msg.what = SDK_PAY_FLAG;
         msg.obj = result;
         mHandler.sendMessage(msg);
     };
     Thread payThread = new Thread(payRunnable);
     payThread.start();
    }
    /**
    * 支付寶支付回調處理
    */
    @SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler() {
     @SuppressWarnings("unused")
     public void handleMessage(Message msg) {
         switch (msg.what) {
             case SDK_PAY_FLAG: {
                 PayResult payResult = new PayResult((String) msg.obj);
                 String resultInfo = payResult.getResult();// 同步返回需要驗證的信息
                 String resultStatus = payResult.getResultStatus();
                 // 判斷resultStatus 為“9000”則代表支付成功,具體狀態碼代表含義可參考接口文檔
                 if (TextUtils.equals(resultStatus, "9000")) {
                     Toast.makeText(PayActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
                 } else {
                     if (TextUtils.equals(resultStatus, "8000")) {
                         Toast.makeText(PayActivity.this, "支付結果確認中", Toast.LENGTH_SHORT).show();
                     } else {
                         // 其他值就可以判斷為支付失敗,包括用戶主動取消支付,或者系統返回的錯誤
                         Toast.makeText(PayActivity.this, "支付失敗", Toast.LENGTH_SHORT).show();
                     }
                 }
                 break;
             }
             default:
                 break;
         }
     }
    };

    遇到的問題

  5. 很容易遇到的問題就是支付參數遺漏,可以直接 查看文檔
  6. 還會可能遇到支付錯誤,可以直接 查看文檔

 

來自:http://www.jianshu.com/p/fcd1c36f6230

 

 本文由用戶 lsyh0673 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!