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