前言
支付寶,是以每個人為中心,以實名和信任為基礎的一站式場景平台。
自2004年成立以來,支付寶已經與超過200家金融機構達成合作,為近千萬小微商戶提供支付服務,拓展的服務場景不斷增加。
支付寶也得到了更多使用者的喜愛,截至2015年6月底,實名使用者數已經超過4億。
在覆寫絕大部分線上消費場景的同時,支付寶也正在大力拓展各種線下場景,包括餐飲、超市、便利店、計程車、公共交通等。
準備工作
1,需要開發者到支付寶的開發者平台注冊申請,送出相關資料稽核,稽核通過後會獲得合作者ID(PID)。
接口申請url
建立應用
2,下載下傳支付包內建開發包。
支付寶內建開發包
(3)解壓支付寶SDK內建包,裡面有說明文檔,DEMO,主要用到的是支付寶接口和DEMO。
3,內建
(1)導入開發資源
(2)修改Manifest
在商戶應用工程的AndroidManifest.xml檔案裡面添加聲明:
<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" >
</activity>
<activity
android:name="com.alipay.sdk.auth.AuthActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" >
</activity>
和權限聲明:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
(3) 添加混淆規則
-libraryjars libs/alipaySdk-20151103.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)設定支付的商戶号PID,收款賬号,商戶私鑰,支付寶公鑰,回調位址。
public class AlibabaPay {
// 商戶PID
public static final String PARTNER = "XXXXXXXXX";
// 商戶收款賬号
public static final String SELLER = "XXXXXX";
// 商戶私鑰,pkcs8格式
public static final String RSA_PRIVATE = "XXXX";
// 支付寶公鑰
public static final String RSA_PUBLIC = "XXXXXXXXXX";
// 回調位址
public static final String NOTIFY_URL = "http:XXXXXXXXXXX.htmL";
public final static int RQF_PAY = 1;
public final String TAG = "alibaba-pay";
public String orderName;
public String orderDescription;
public String orderSn;
public String orderPrice;
public String privateKey;
public String defSeller;
public String defPartner;
public String publicKey;
public String notifyUrl;
private Handler mHandler;
private Activity mActivity;
public AlibabaPay(Handler h, Activity activity) {
mHandler = h;
mActivity = activity;
}
public void pay() {
try {
Log.i(TAG, "pay()");
String info = getNewOrderInfo();
// 對訂單做RSA 簽名
String sign = SignUtils.sign(info, this.privateKey);
try {
// 僅需對sign 做URL編碼
sign = URLEncoder.encode(sign, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// 完整的符合支付寶參數規範的訂單資訊
final String payInfo = info + "&sign=\"" + sign + "\"&"
+ getSignType();
final String orderInfo = info;
new Thread() {
public void run() {
PayTask alipay = new PayTask(mActivity);
// 調用查詢接口,擷取查詢結果
String result = alipay.pay(payInfo);
Message msg = new Message();
msg.what = RQF_PAY;
msg.obj = result;
mHandler.sendMessage(msg);
;
}
}.start();
} catch (Exception ex) {
ex.printStackTrace();
}
}
private String getNewOrderInfo() {
StringBuilder sb = new StringBuilder();
sb.append("partner=\"");
sb.append(defPartner);
sb.append("\"&seller_id=\"");
sb.append(this.defSeller);
sb.append("\"&out_trade_no=\"");
sb.append(orderSn);
sb.append("\"&subject=\"");
sb.append(orderName);
sb.append("\"&body=\"");
sb.append(orderDescription);
sb.append("\"&total_fee=\"");
sb.append(orderPrice);
sb.append("\"¬ify_url=\"");
// 網址需要做URL編碼
sb.append(this.notifyUrl);
sb.append("\"&service=\"mobile.securitypay.pay");
sb.append("\"&_input_charset=\"utf-8");
sb.append("\"&return_url=\"");
sb.append("http://m.alipay.com");
sb.append("\"&payment_type=\"1");
sb.append("\"&it_b_pay=\"30m");
// 如果show_url值為空,可不傳
// sb.append("\"&show_url=\"");
sb.append("\"&it_b_pay=\"1m");
sb.append("\"");
return sb.toString();
}
private String getSignType() {
return "sign_type=\"RSA\"";
}
}
5,添加訂單資訊,比如訂單号, 訂單名稱,訂單價格等等。
(私鑰和商戶号ID,回調位址 都是通過服務端傳回的,也可以不通過服務端傳回就在這個類AlibabaPay寫死。)
AlibabaPay alipay = new AlibabaPay(mHandler,目前activity);
alipay.orderDescription = "訂單詳情";
alipay.orderName = "訂單名稱";
alipay.orderPrice ="";// 訂單價格
alipay.orderSn = ""; //訂單編号
alipay.defPartner =+ ""; //商戶号ID(PID)
alipay.privateKey = ""; //私鑰
alipay.notifyUrl = ""; //回調位址
alipay.pay();
6,支付傳回結果資訊。
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case AlibabaPay.RQF_PAY:
PayResult payResult = new PayResult((String) msg.obj);
// 支付寶傳回此次支付結果及加簽,建議對支付寶簽名資訊拿簽約時支付寶提供的公鑰做驗簽
String resultInfo = payResult.getResult();
String resultStatus = payResult.getResultStatus();
// 判斷resultStatus 為“9000”則代表支付成功,具體狀态碼代表含義可參考接口文檔
if (TextUtils.equals(resultStatus, "9000")) {
Toast.makeText(HPDSOrderSubmitResultActivity.this, "支付成功",
Toast.LENGTH_SHORT).show();
finish();
} else {
// 判斷resultStatus 為非“9000”則代表可能支付失敗
// “8000”代表支付結果因為支付管道原因或者系統原因還在等待支付結果确認,最終交易是否成功以服務端異步通知為準(小機率狀态)
if (TextUtils.equals(resultStatus, "8000")) {
Toast.makeText(HPDSOrderSubmitResultActivity.this,
"支付結果确認中", Toast.LENGTH_SHORT).show();
finish();
} else {
// 其他值就可以判斷為支付失敗,包括使用者主動取消支付,或者系統傳回的錯誤
Toast.makeText(HPDSOrderSubmitResultActivity.this, "支付失敗",
Toast.LENGTH_SHORT).show();
finish();
}
}
break;
default:
break;
}
};
};
注:我這邊使用支付寶SDK的JAR是14年下載下傳的~(如果開發中有問題可以這裡留言。)