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