1. 程式人生 > >Android開發之微信支付,支付寶支付

Android開發之微信支付,支付寶支付

今天想跟大家分享一下Android開發中的支付功能,基本上所有的商城類專案都會用到微信支付,支付寶支付,相信很多初學者在開發的過程中也曾遇到跟我一樣的情況:看完開發文件之後,做出來的功能怎麼呼叫不起來,經過後來的反覆除錯才成功的完成支付功能,下面我就簡單的來說說微信支付和支付寶支付的注意事項。

專案的下載連結我也放在結尾,有需要的朋友可以下載看看,歡迎大家提出意見。

微信支付注意事項:

1.建立專案的時候填寫的應用包名,相信這個沒有開發者會出錯。

2.建立專案的時候填寫的簽名檔案的簽名串,填寫的是簽名檔案的MD5值,值得注意的是,微信要求去掉MD5值當中的冒號,並且改大寫為小寫,當初我就是在這個上面犯了錯,當時的微信文件也沒有仔細說明。、

3.完成功能測試的時候,需要使用簽名檔案簽名後的APK進行測試,否則會呼叫不起來。(不使用簽名檔案簽名,有可能能調起第一次支付,後面就呼叫不起來了)

4.檢查核對APP_ID是否正確,在專案過程中有多個地方需要用到APP_ID,AndroidManifest檔案中也需要使用到。

支付寶支付注意事項:

1.其實支付寶支付挺簡單的,沒有微信那麼複雜,只要檢查key以及公鑰和私鑰的正確性就行了,然後按照demo來一步步整合就能實現功能了。

下面不多說廢話了,上程式碼說明:‘’

xml檔案就兩個按鈕,就不貼出來了,直接上java程式碼:

微信支付程式碼:

// 微信支付必須引數
    String appId = "wxd930ea5d5a258f4f";
    String partnerId = "";
    String prepayId = "";
    String packageValue = "";
    String nonceStr = "";
    String timeStamp = "";
    String sign = "";
這是微信支付需要的引數,少一個或者有一個值為空都不行,引數是有了,下面就是發起微信支付了,這裡我自己寫了工具類WXPayHelper用來封裝微信支付,這樣方便在多個地方呼叫微信支付功能。
/**
     * 發起微信支付
     */
    private void toWxPay(){
        PayConfig payConfig = new PayConfig();
        payConfig.setAppid(appId);
        payConfig.setPartnerid(partnerId);
        payConfig.setNoncestr(nonceStr);
        payConfig.setPrepayid(prepayId);
        payConfig.setPack(packageValue);
        payConfig.setPaySign(sign);
        payConfig.setTimestamp(timeStamp);

        WXPayHelper payHelper = new WXPayHelper(this);
        payHelper.doPay(payConfig);
    }
下面是WXPayHelper工具類中的操作:
/**
	 * 使用後臺返回的支付引數支付
	 * 
	 * @param payConfig
	 */
	public void doPay(PayConfig payConfig) {

		req.appId = payConfig.getAppid();
		req.partnerId = payConfig.getPartnerid();
		req.prepayId = payConfig.getPrepayid();
		req.packageValue = payConfig.getPack();
		req.nonceStr = payConfig.getNoncestr();
		req.timeStamp = payConfig.getTimestamp();
		req.sign = payConfig.getPaySign();

		PayReq request = new PayReq();
		request.appId = req.appId;
		request.partnerId = req.partnerId;
		request.prepayId= req.prepayId;
		request.packageValue = req.packageValue;
		request.nonceStr= req.nonceStr;
		request.timeStamp= req.timeStamp;
		request.sign= req.sign;

		// 發起支付
		msgApi.sendReq(req);
	}
支付結果在回撥頁面WXPayEntryActivity展示:
/**
     * 支付結果回撥
     * @param resp
     */
    @Override
    public void onResp(BaseResp resp) {
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            int code = resp.errCode;
            switch (code) {
                case 0: // 支付成功

                    break;
                case -1: // 支付失敗

                    break;
                case -2: // 支付取消

                    break;

                default:
                    break;
            }
        }
    }
AndroidManifest檔案中需要註冊:
<activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />

                <data android:scheme="wxd930ea5d5a258f4f" />
            </intent-filter>
        </activity>

        <!-- 將APP註冊到微信 -->
        <receiver android:name=".wxapi.AppRegister" >
            <intent-filter>
                <action android:name="com.tencent.mm.plugin.openapi.Intent.ACTION_REFRESH_WXAPP" />
            </intent-filter>
        </receiver>

        <!-- 微信支付回撥 -->
        <activity
            android:name=".wxapi.WXPayEntryActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:screenOrientation="portrait" />
好了,微信支付功能基本上就實現了

下面我們講講支付寶支付:
// 支付寶支付
    String payData = "";
支付寶支付的引數,在這裡我為什麼只用一個引數呢,我這裡跟支付寶官網給出的demo有點不一樣,demo的引數是全部分開的,一個一個嵌入,而我這裡只傳了一個payData引數是因為後臺人員已經把支付寶支付所需引數拼接好返回給前端了,所以對於支付寶怎麼傳引數,就看開發者自己定義了
private void getAilPay(String payData) {
        // 完整的符合支付寶引數規範的訂單資訊
        final String payInfo = payData;
        Runnable payRunnable = new Runnable() {

            @Override
            public void run() {
                // 構造PayTask 物件
                PayTask alipay = new PayTask(MainActivity.this);
                // 呼叫支付介面,獲取支付結果
                String result = alipay.pay(payInfo);

                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };

        // 必須非同步呼叫
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }
發起支付寶支付,這一步在支付寶的demo上也有,下面就是回調了
@Override
    public boolean 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(MainActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
                } else {
                    // 判斷resultStatus 為非“9000”則代表可能支付失敗
                    // “8000”代表支付結果因為支付渠道原因或者系統原因還在等待支付結果確認,最終交易是否成功以服務端非同步通知為準(小概率狀態)
                    if (TextUtils.equals(resultStatus, "8000")) {
                        Toast.makeText(MainActivity.this, "支付結果確認中", Toast.LENGTH_SHORT).show();
                    } else {
                        // 其他值就可以判斷為支付失敗,包括使用者主動取消支付,或者系統返回的錯誤
                        Toast.makeText(MainActivity.this, "支付失敗", Toast.LENGTH_SHORT).show();
                    }
                }
                break;
            }
            case SDK_CHECK_FLAG: {
                Toast.makeText(MainActivity.this, "檢查結果為:" + msg.obj, Toast.LENGTH_SHORT).show();
                break;
            }
        }
        return false;
    }
AndroidManifest檔案中需要註冊:
<!-- 支付寶支付回撥 -->
        <!-- alipay sdk begin -->
        <activity
            android:name="com.alipay.sdk.app.H5PayActivity"
            android:configChanges="orientation|keyboardHidden|navigation"
            android:exported="false"
            android:screenOrientation="behind"
            android:windowSoftInputMode="adjustResize|stateHidden" >
        </activity>
        <!-- alipay sdk end -->
支付寶支付到這裡也就完成了,有需要的朋友可以下載demo看看