支付宝支付很简单,但是新的sdk还是有些坑要去踩下才知道。
1.省略一些步骤。下载最新sdk。
2.调用本地支付方法 zfbPay();方法参数都是后台接口返回,具体参数如下:
{
"code": 200,
"data": {
"acctId": "",
"amount": "",
"callback": "", //回调地址
"keyWord": "",
"orderid": "", //订单号
"privatekey": "", //私钥
"sellerId": "" //商户id
},
"flag": true,
"info": "",
"msg": ""
}
private void zfbPay(String privateKey, String sellerId, String out_trade_no, String body, String notify_url, String price) {
boolean rsa2 = true;
Map<String, String> params = OrderInfoUtil2_0.buildOrderParamMap(sellerId, body, out_trade_no, notify_url, price, rsa2);
String orderParam = OrderInfoUtil2_0.buildOrderParam(params);
String sign = OrderInfoUtil2_0.getSign(params, privateKey, rsa2);
// 完整的符合支付宝参数规范的订单信息
final String orderInfo = orderParam + "&" + sign;
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(SelectPayTypeActivity.this);
Map<String, String> result = alipay.payV2(orderInfo, true);
LogUtil.i("msp", result.toString());
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
Thread payThread = new Thread(payRunnable);
payThread.start();
}
public class OrderInfoUtil2_0 {
/**
* 构造支付订单参数列表
*
* @param app_id
* @return
*/
public static Map buildOrderParamMap(String app_id, String body, String out_trade_no, String notify_url, String money, boolean rsa2) {
Map keyValues = new HashMap();
//商户签约拿到的app_id,如:2013081700024223
keyValues.put("app_id", app_id);
keyValues.put("biz_content", "{\"timeout_express\":\"30m\"," +
"\"product_code\":\"QUICK_MSECURITY_PAY\"," +
"\"total_amount\":\""+money+"\"," +
"\"subject\":\"" + "支付订单" + "\"," +
"\"body\":\"支付\"," +
"\"out_trade_no\":\"" + out_trade_no + "\"}");
keyValues.put("charset", "utf-8");
keyValues.put("method", "alipay.trade.app.pay");
keyValues.put("sign_type", rsa2 ? "RSA2" : "RSA");
keyValues.put("notify_url", notify_url);
keyValues.put("timestamp", getTimeStamp()); // 2016-07-29 16:55:53
keyValues.put("body", body);
keyValues.put("version", AppData.APP_VERSION);
return keyValues;
}
private static String getTimeStamp() {
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateNowStr = sdf.format(d);
return dateNowStr;
}
/**
* 构造支付订单参数信息
*
* @param map 支付订单参数
* @return
*/
public static String buildOrderParam(Map map) {
List keys = new ArrayList(map.keySet());
StringBuilder sb = new StringBuilder();
for (int i = 0; i < keys.size() - 1; i++) {
String key = keys.get(i);
String value = map.get(key);
sb.append(buildKeyValue(key, value, true));
sb.append("&");
}
String tailKey = keys.get(keys.size() - 1);
String tailValue = map.get(tailKey);
sb.append(buildKeyValue(tailKey, tailValue, true));
return sb.toString();
}
/**
* 拼接键值对
*
* @param key
* @param value
* @param isEncode
* @return
*/
private static String buildKeyValue(String key, String value, boolean isEncode) {
StringBuilder sb = new StringBuilder();
sb.append(key);
sb.append("=");
if (isEncode) {
try {
sb.append(URLEncoder.encode(value, "UTF-8"));
} catch (UnsupportedEncodingException e) {
sb.append(value);
}
} else {
sb.append(value);
}
return sb.toString();
}
/**
* 对支付参数信息进行签名
*
* @param map 待签名授权信息
* @return
*/
public static String getSign(Map map, String rsaKey, boolean rsa2) {
List keys = new ArrayList(map.keySet());
// key排序
Collections.sort(keys);
StringBuilder authInfo = new StringBuilder();
for (int i = 0; i < keys.size() - 1; i++) {
String key = keys.get(i);
String value = map.get(key);
authInfo.append(buildKeyValue(key, value, false));
authInfo.append("&");
}
String tailKey = keys.get(keys.size() - 1);
String tailValue = map.get(tailKey);
authInfo.append(buildKeyValue(tailKey, tailValue, false));
String oriSign = SignUtils.sign(authInfo.toString(), rsaKey, rsa2);
String encodedSign = "";
try {
encodedSign = URLEncoder.encode(oriSign, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return "sign=" + encodedSign;
}
/**
* 要求外部订单号必须唯一。
*
* @return
*/
private static String getOutTradeNo() {
SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss", Locale.getDefault());
Date date = new Date();
String key = format.format(date);
Random r = new Random();
key = key + r.nextInt();
key = key.substring(0, 15);
return key;
}
}
private Handler mHandler = new Handler() {
@SuppressWarnings("unused")
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
@SuppressWarnings("unchecked")
PayResult payResult = new PayResult((Map) msg.obj);
/**
对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
*/
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为9000则代表支付成功
if (TextUtils.equals(resultStatus, "9000")) {
// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
Toast.makeText(SelectPayTypeActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
finish();
} else {
// 该笔订单真实的支付结果,需要依赖服务端的异步通知。
Toast.makeText(SelectPayTypeActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
}
break;
}
default:
break;
}
}
;
};