Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android支付寶支付

Android支付寶支付

編輯:關於Android編程

接入流程及說明

官方地址:https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.erBW90&treeId=59&articleId=103657&docType=1

接入前准備階段

1.商戶簽約審核(一般是公司的運營人員來做,生成PID)https://doc.open.alipay.com/doc2/detail.htm?treeId=58&articleId=103542&docType=1
2.RSA私鑰及公鑰生成(有幾種加密方法,這裡支付用的是RSA方式)
密鑰作用(為了數字簽名)
數字簽名技術是將信息摘要用發送者的私鑰加密,與原文一起傳送給接收者。接收者只有用發送者的公鑰才能解密被加密的信息摘要,然後接收者用相同的Hash函數
對收到的原文產生一個信息摘要,與解密的信息摘要做比對。如果相同,則說明收到的信息是完整的,在傳輸過程中沒有被修改;不同則說明信息被修改過,因此數字
簽名能保證信息的完整性。並且由於只有發送者才有加密摘要的私鑰,所以我們可以確定信息一定是發送者發送的。
生成步驟:https://doc.open.alipay.com/doc2/detail?treeId=58&articleId=103242&docType=1
上傳步驟:https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.a3hvUz&treeId=58&articleId=103578&docType=1

集成流程詳解

SDK付款有兩種模式:如果外部存在支付寶錢包,則直接跳轉到支付寶錢包付款;沒有支付寶錢包的場景下,將觸發在SDK內部進行H5支付。商戶在測試集成支付是否
正常的時候,建議測試(存在、沒有)支付寶錢包的場景。對於測試過程中出現的異常,請聯系支付寶技術支持進行處理。

1.導入開發資源
我們上面alipay-sdk-common中的三個jar文件拷貝到我們項目下的libs目錄下,結構圖如下


2.修改Manifest
    在商戶應用工程的AndroidManifest.xml文件裡面添加聲明:



 
和權限聲明:






3.添加混淆規則
在商戶應用工程的proguard-project.txt裡添加以下相關規則:
-libraryjars libs/alipaySDK-20150602.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 *;}
至此,開發包開發資源導入完成。

4.訂單數據生成
在調用開發包支付時需要提交訂單信息info,其中參數以key=”value”形式呈現,參數之間以“&”分隔,所有參數不可缺。

5.支付接口調用
需要在新線程中調用支付接口。(可參考alipay_demo實現)
獲取PayTask支付對象調用支付(支付或者授權的行為需要在獨立的非ui線程中執行),代碼示例:
final String orderInfo = info;   // 訂單信息

        Runnable payRunnable = new Runnable() {

            @Override
            public void run() {
                PayTask alipay = new PayTask(DemoActivity.this);
                String result = alipay.pay(orderInfo,true);

                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };
         // 必須異步調用
        Thread payThread = new Thread(payRunnable);
        payThread.start();

6.支付結果獲取和處理
調用pay方法支付後,將通過2種途徑獲得支付結果:
同步返回
商戶應用客戶端通過當前調用支付的Activity的Handler對象,通過它的回調函數獲取支付結果。(可參考alipay_demo實現)
代碼示例:
private Handler mHandler = new Handler() {
    public void handleMessage(Message msg) {
        Result result = new Result((String) msg.obj);
        Toast.makeText(DemoActivity.this, result.getResult(),
                    Toast.LENGTH_LONG).show();
    };
};
異步通知
商戶需要提供一個http協議的接口,包含在參數裡傳遞給快捷支付,即notify_url。支付寶服務器在支付完成後,
會以POST方式調用notify_url,以xml數據格式傳輸支付結果。

7.請求參數說明
請求參數是商戶在與支付寶進行數據交互時,提供給支付寶的請求數據,以便支付寶根據這些數據進一步處理。

特殊說明(很重要):

商戶在請求參數中,自己附屬的一些額外參數,不要和支付寶系統中約定的key(下表中)重名,否則將可能導致未知的異常。
比如請求參數格式 out_trade_no="1234566"&total_fee="123.5"&rn_check="TRE" 其中out_trade_no、total_fee、rn_check
都是支付業務處理關鍵key,這個裡面商戶自己將out_trade_no、total_fee認為是支付寶必須傳輸的參數,rn_check=“TRE”是商戶自己
的業務數據,但是由於rn_check也是支付寶關鍵key,支付寶將會認為這個rn_check是支付寶業務的參數,將導致誤解析,導致支付出現不可預料的異常。
支付寶建議,商戶不要在請求參數中添加除了支付寶指定的關鍵key外,還有其他的key用&連接。
比如 out_trade_no="1234566"&total_fee="123.5"&homepage="http://www.***.com" ,其中homepage是商戶自己的業務key,支付寶建議不要
在請求參數中附帶和支付無關的業務系統自身的key相關數據。
商戶的請求參數中,所有的key(支付寶關鍵key或者商戶自己的key),其對應的value中都不應該出現支付寶關鍵key,比如out_trade_no、total_fee、
seller_id等,否則該類交易將可能被支付寶攔截,禁止支付。
比如如下的請求 out_trade_no="1234566"&total_fee="123.5"&homepage="http://www.***.com"&body="這個辣條不錯 out_trade_no=123 
total_fee=123.5"&memo="備忘seller_id=2088123213" 這個請求裡面的body對應的value值中有支付寶關鍵key“out_trade_no”以及“total_fee”,
請求中對於memo字段中含有seller_id,這樣的業務請求參數支付寶將會攔截。
1
partner="2088101568358171"&seller_id="[email protected]"&out_trade_no="0819145412-6177"&subject="測試"&body="測試測試
"&total_fee="0.01"¬ify_url="http://notify.msp.hk/notify.htm"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="30m"&
sign="lBBK2F0w5LOajrMrji7DUgEqNjIhQbidR13GovA5r3TgIbNqv231yC1NksLdw%2Ba3JnfHXoXuet6XNNHtn7VE%2BeCoRO1O%2BR1KugLrQEZMtG5jmJIe2p
bjm%2F3kb%2FuGkpG%2BwYQYI51%2BhA3YBbvZHVQBYveBqK%2Bh8mUyb7GM1HxWs9k4%3D"&sign_type="RSA"





案例

獲取網絡數據

   private void getNetDataForAli(String serviceInstId,String studentId) {
    final TranLoading loading = new TranLoading(mContext);
    loading.show();
    RequestParams params = new RequestParams();
    params.addBodyParameter(Constant.NET_USERID,
            share.getString(Constant.SP_USERID, ""));
    params.addBodyParameter(Constant.NET_TOKEN,
            share.getString(Constant.SP_TOKEN, " "));
    params.addBodyParameter(Constant.NET_STUDENT_ID,studentId);
    params.addBodyParameter(Constant.NET_SERVICEINST_ID, serviceInstId);
    HttpUtils http = new HttpUtils(Constant.HTTP_TIME_OUT_LONG);
    http.send(HttpRequest.HttpMethod.POST, UrlUtis.SERVICE_ORDER_PAY_ALI,
            params, new RequestCallBack() {

                @Override
                public void onSuccess(ResponseInfo responseInfo) {

                    try {
                        JSONObject jsonObject = new JSONObject(
                                responseInfo.result);
                        final String success = jsonObject
                                .getString("success");
                        Log.e(TAG, jsonObject.toString());
                        JSONObject ob = new JSONObject(jsonObject
                                .getString(Constant.NET_OBJ));
                        outTradeNO = ob.getString(Constant.NET_OUTTRADENO);
                        payInfo = ob.getString(Constant.NET_ALI_PAYINFO);
                        if (Constant.NET_ALI_SUCCESS_TRUE.equals(success)) {
                            payForAli();
                        } else if (Constant.NET_ALI_SUCCESS_FSLSE
                                .equals(success)) {
                            final String msg = jsonObject.getString("msg");
                            ViewUtil.shortToast(mContext, msg);
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    loading.dismiss();
                }

                @Override
                public void onFailure(HttpException error, String msg) {
                    loading.dismiss();
                    ViewUtil.shortToast(mContext,
                            mContext.getString(R.string.error_net));
                }
            });

}


異步消息

 private Handler mHandler = new Handler() {
    public void handleMessage(Message msg) {
        switch (msg.what) {
        case Constant.SDK_PAY_FLAG: {
            PayResult payResult = new PayResult((String) msg.obj);
            String resultStatus = payResult.getResultStatus();
            if (TextUtils.equals(resultStatus, "9000")) {
                ViewUtil.shortToast(mContext,
                        getString(R.string.pay_success));
                //支付成功後改變存放的權限值
                CommonUtils.getServiceData(mContext);
                Intent intent = new Intent();
                setResult(RESULT_OK, intent.putExtra(
                        Constant.EXTRA_SERVICE_PAY_SUCCESS,
                        Constant.EXTRA_SERVICE_PAY_SUCCESS_TRUE));
                finish();

            } else {
                if (TextUtils.equals(resultStatus, "8000")) {
                    ViewUtil.shortToast(mContext,
                            getString(R.string.pay_be_sure));
                    // 每五秒鐘輪循
                    handler.postDelayed(runnable, 5000);
                } else {
                    ViewUtil.shortToast(mContext,
                            getString(R.string.pay_fails));
                }
            }
            break;
        }
        case Constant.SDK_CHECK_FLAG: {
            ViewUtil.shortToast(mContext,
                    getString(R.string.pay_check_result) + msg.obj);
            break;
        }
        default:
            break;
        }
    };
};
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved