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

Android-支付寶支付

編輯:關於Android編程

前言:
緊接著上一篇的微信支付,本篇是集成支付寶支付,相對於微信支付,支付寶的集成就簡單了很多。話不多說,我們來看看怎麼簡單集成支付寶支付。
1.看文檔:
我們先要去螞蟻金服開放平台進行申請,這個需要公司的相關信息,目前個人是不支持的。
這裡寫圖片描述
信息的填寫就不介紹了,這個也不是我們所關心的,同時,支付寶更多的是服務器端的集成,甚至不需要我們的包名和簽名,app端集成真的就是幾句話代碼的事情。
2.按照接口文檔說明集成:
android支付詳情介紹,這個是支付寶介紹的官方頁面,雖然簡單,但是足夠了,所以感慨下支付寶的工程師的確是很強大,簡單實用。具體步驟為:
2.1 下載jar包,然後放在lib文件夾下面,最好下載最新的jar包。
2.2 修改manifest:
添加權限:





添加Activity申明:




 

3.代碼編輯:
3.1 為了方便我們建一個PayUtils,代碼如下:

public class PayUtils {

    private Activity mActivity;

    public void setActivity(Activity activity) {
        mActivity = activity;
        setHandle(mActivity);
    }

    private void setHandle(Activity mact) {
        mHandler = new Handler(mact.getMainLooper()) {
            public void handleMessage(Message msg) {
                Log.i("wy", "11111111111" + msg.what);
                switch (msg.what) {
                    case SDK_PAY_FLAG: {
                        PayResult payResult = new PayResult((Map) msg.obj);
                        /**
                         對於支付結果,請商戶依賴服務端的異步通知結果。同步通知結果,僅作為支付結束的通知。
                         */
                        String resultInfo = payResult.getResult();// 同步返回需要驗證的信息
                        String resultStatus = payResult.getResultStatus();
                        // 判斷resultStatus 為9000則代表支付成功
                        if (TextUtils.equals(resultStatus, "9000")) {
                            // 該筆訂單是否真實支付成功,需要依賴服務端的異步通知。
                            Log.i("wy", "1");
                        } else {
                            // 該筆訂單真實的支付結果,需要依賴服務端的異步通知。
                            Log.i("wy", "2");
                        }
                        break;
                    }
                    case SDK_AUTH_FLAG: {
                        AuthResult authResult = new AuthResult((Map) msg.obj, true);
                        String resultStatus = authResult.getResultStatus();
                        // 判斷resultStatus 為“9000”且result_code
                        // 為“200”則代表授權成功,具體狀態碼代表含義可參考授權接口文檔
                        if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {
                            // 獲取alipay_open_id,調支付時作為參數extern_token 的value
                            // 傳入,則支付賬戶為該授權賬戶
                            Log.i("wy", "3");
                        } else {
                            // 其他狀態值則為授權失敗
                            Log.i("wy", "4");
                        }
                        break;
                    }
                    default:
                        break;
                }
            }
        };
    }

    private static final int SDK_PAY_FLAG = 11;
    private static final int SDK_CHECK_FLAG = 12;
    private static final int MSG_GET_ACTIVATION = 2;
    private static final int SDK_AUTH_FLAG = 2;

    private Handler mHandler;

    //調用該方法進行支付寶sdk調用
    public void pay(final String payInfo) {
        Runnable authRunnable = new Runnable() {
            @Override
            public void run() {
                // 構造AuthTask 對象
                AuthTask authTask = new AuthTask(mActivity);
                // 調用授權接口,獲取授權結果
                Map result = authTask.authV2(payInfo, true);
                Message msg = new Message();
                msg.what = SDK_AUTH_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };
        // 必須異步調用
        Thread authThread = new Thread(authRunnable);
        authThread.start();
    }

}

代碼很簡單,一個handler,一個調用支付寶的pay方法,注意該handler的生成方法,開始我new Handler的時候沒有指定looper,因為該類沒有默認的Activity對象,所以會報”Can’t create handler inside thread that has not called Looper.prepare()”錯誤,不清楚handler的同學,可以去看我以前寫的一篇博客(Java中的多線程Thread Runnable及android的handler)。

3.2 Main中的代碼:

public class MainActivity extends AppCompatActivity {
    private TextView tv_send;
    private PayUtils mPayUtils;

    //這些都是服務器定義的字段
    private String title = "支付訂單";
    private String ordertype = "0";
    private String tomemid="";
    private String price="0.01";
    private String price_tbb = "0";
    private String paytype = "2";
    private String zfpass="";
    private String tokenid="";
    private String platform = "0";

    private  String responsestr="";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_send= (TextView) findViewById(R.id.tv_send);
        tv_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getData();
            }
        });
    }

    private void getData(){

        Map map = new HashMap<>();
        map.put("tradetype", "APP");
        map.put("title", title);
        map.put("ordertype", ordertype);
        map.put("tomemid", tomemid);
        map.put("price", price);
        map.put("price_tbb", price_tbb);
        map.put("paytype", paytype);
        map.put("zfpass", zfpass);

        PayRequestParam param=new PayRequestParam();
        param.setTradetype("APP");//用戶名
        param.setTitle(title);
        param.setTomemid(tomemid);
        param.setPrice(price);
        param.setPrice_tbb(price_tbb + "");
        param.setOrdertype(ordertype);//
        param.setPaytype(paytype);//
        param.setZfpass(zfpass);
        param.setSign(SignUtils.getXfbSign(map));

        PayRequestObject requestobject=new PayRequestObject();
        requestobject.setTokenid(tokenid);
        requestobject.setPlatform(platform);
        requestobject.setParam(param);

        //fastjson
        String jsonstr=JSON.toJSONString(requestobject);

        String url ="";
        //okhttp3
        OkHttpClient client=new OkHttpClient();
        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), jsonstr);

        final Request request=new Request.Builder().url(url).post(requestBody).build();
        Log.i("wy","111111111111");
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                responsestr=response.body().string();

                PayResponseObject object= (PayResponseObject) JSON.parseObject(responsestr,PayResponseObject.class);
                if(mPayUtils==null){
                    mPayUtils=new PayUtils();
                    mPayUtils.setActivity(MainActivity.this);
                }

                mPayUtils.pay(object.getData());
            }
        });
    }

}

這裡面更多的是和自己服務器定義接口的一些參數,請求獲取代調用支付寶時的String 參數payInfo,該參數的組成可以看支付寶的接口文檔,我們客服端也可以自己拼接,但是十分不建議這樣做。

3.3其他涉及到的類可以在文末點擊下載

4總結:
支付寶支付相對微信支付而言簡單太多,並且可以在打包的情況下進行測試,方便開發,但是這只是對於我們移動端開發來說方便很多;大量的工作其實是丟鍋給了服務器端。但是對於支付寶的文檔以及流程我還是建議大家能夠細細的研讀,這對於我們開發的思路是大有裨益的。ok,兩大支付都介紹完了,希望可以幫到大家。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved