編輯:關於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(){ Mapmap = 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,兩大支付都介紹完了,希望可以幫到大家。
在前面一篇文章中,我們分析了ART運行時加載類以及查找其方法的過程。一旦找到了目標類方法,我們就可以獲得它的DEX字節碼或者本地機器指令,這樣就可以對它進行執行了。在AR
窗口管理系統是Android中的主要子系統之一,它涉及到App中組件的管理,系統和應用窗口的管理和繪制等工作。由於其涉及模塊眾多,且與用戶體驗密切相關,所以它也是Andr
動畫在Material Design設計中給用戶反饋放用戶點擊時,並且在程序用戶界面中提供連貫的視覺。Material主題為按鈕(Button)和activity的轉換提
Buzz桌面的一大特色就是可以自己隨意更換應用程序的圖標,嫌棄官方的圖標不好看、看膩了,沒關系,咋換一個!圖標你可以自己制作,也可以下載網友分享的都行。&n