转发自:支付的那些套路(手机支付宝篇)
安卓和IOS的支付方式是不同的,安卓走接口,IOS走内购,官方文档写的还算可以,安卓的基本套路是这样的:
so:根据阿里提供的文档拼接参数
Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("app_id", PayPropertiesUtils.getString("alipay.appPay.appId"));
paramMap.put("method", PayPropertiesUtils.getString("alipay.appPay.method"));
paramMap.put("format", PayPropertiesUtils.getString("alipay.appPay.format"));
paramMap.put("charset", PayPropertiesUtils.getString("alipay.inputCharset"));
//发送请求的时间,格式"yyyy-MM-dd HH:mm:ss" 2014-07-24 03:07:50
paramMap.put("timestamp", UtilDate.getDateFormatter());
paramMap.put("version", PayPropertiesUtils.getString("alipay.appPay.version"));
paramMap.put("notify_url", PayPropertiesUtils.getString("alipay.appPay.notifyUrl"));
//业务对象
Map<String, String> bizContentMap = new HashMap<String, String>();
bizContentMap.put("body", GlobalConstants.PAY_PRODUCT_NAME);
bizContentMap.put("subject", GlobalConstants.PAY_PRODUCT_NAME);
bizContentMap.put("out_trade_no", payExtendVo.getOrderId());
bizContentMap.put("timeout_express",PayPropertiesUtils
.getString("alipay.appPay.timeoutExpress"));
bizContentMap.put("total_amount", String.valueOf(payExtendVo.getPayAmount()));
bizContentMap.put("product_code", PayPropertiesUtils
.getString("alipay.appPay.productCode"));
String biz_content = JSON.toJSONString(bizContentMap);
paramMap.put("biz_content", biz_content);
String sign_type = PayPropertiesUtils.getString("alipay.appPay.signType");
paramMap.put("sign_type",sign_type);
//去除空值
Map<String,String> signMap = AlipayCore.paraAppFilter(paramMap);
//生成签名
String sign = Signature.buildRequestMysign(signMap,sign_type,RSA_PRIVATE_KEY);
sign = URLEncoder.encode(sign,"utf-8");
signMap.put("sign", sign);
//获取业务参数串
String reqOrderStr = AlipayCore.createLinkString(signMap);
然后篇拼接返回给App的参数:
Map returnMap = new HashMap();
returnMap.put("reqPayUrl", reqOrderStr);
returnMap.put("orderId",payExtendVo.getOrderId());
returnMap.put("payAmount",tradeLog.getPayAmount());
returnMap.put("income",tradeLog.getIncome());
returnMap.put("rewardFanpiao",tradeLog.getRewardFanpiao());
returnMap.put("incomeAmount",tradeLog.getIncomeAmount());
resultBean.setData(returnMap);
最后存库,支付状态是待支付。
手机端通过SDK调用之后根据订单ID请求服务器支付状态。
接下来是阿里给服务器的回调,如果代码理由AOP或者拦截提前排除掉这个请求:
首先解析参数 :
Map<String, String> checkParamsMap = new HashMap<String,String>();
Map requestParams = thridPartyNotifyVo.getAliPayRequestParamsMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
checkParamsMap.put(name, valueStr);
}
然后验证参数是否和合法,是不是从阿里发出来的,可以调用阿里给的demo里的方法:
AlipayNotify.verify(checkParamsMap,PayPropertiesUtils.getString("alipay.appPay.signType"),PayPropertiesUtils.getString("alipay.appPay.alipayPublicKey"))
如果是true:更数据库的状态:最后给支付宝一个success,告诉支付宝回调已成功。