編輯:關於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="xxx@alipay.com"&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;
}
};
};
Android系統如何錄制屏幕(錄制成mp4格式)
不管是教學,還是為了演示,如果能將Android手機(或平板)的屏幕錄制成視頻文件,那是一件非常酷的事(iOS8已經提供了這一功能,能通過OSX直接在Mac上錄制iPad
android設備終端與藍牙模塊(HC-06)的通訊編程思路
藍牙模塊(HC-06): private BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter
Android應用開發之所有動畫使用詳解
1 背景Android系統提供了很多豐富的API去實現UI的2D與3D動畫,最主要的劃分可以分為如下幾類:View Animation: 視圖動畫在古老的Android版
Android Studio 打多渠道包
最近,公司的項目開始使用谷歌官方最新推出的IDE——Android Studio 1.0,發現使用studio打渠道包很容易。 下面