1.支付寶已經(jīng)更新添加了封裝好的簽名方法,可以在自己的項(xiàng)目中直接調(diào)用進(jìn)行簽名,減少了自己手動(dòng)簽名產(chǎn)生的問(wèn)題,主要是在進(jìn)行方法調(diào)用時(shí)注意傳參的要求,尤其是公鑰使用的是支付寶的公鑰,而不是APP的公鑰
支付寶鼓勵(lì)使用SDK進(jìn)行簽名,一般調(diào)用RSA2 進(jìn)行簽名,并將返回的值直接傳遞給前端,調(diào)用支付寶支付,舉個(gè)例子:
組裝參數(shù):
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody("支付寶支付");
model.setSubject("App支付測(cè)試Java");
model.setOutTradeNo(order.getOrderNumber());
model.setTimeoutExpress("30m");
model.setTotalAmount(String.valueOf(order.getPrice()));
model.setProductCode("QUICK_MSECURITY_PAY");
tring sign = creatAliPaySign(model);//調(diào)用生成簽名的方法
調(diào)用簽名方法,將組裝好的參數(shù)傳遞給簽名方法:
if(model!=null){
AlipayClient alipayClient = new DefaultAlipayClient( ALIPAY_URL, APP_ID,
APP_PRIVATE_KEY,ALIPAY_FORMAT, ALIPAY_CHARSET,ALIPAY_PUBLIC_KEY, SIGN_TYPE);
//實(shí)例化具體API對(duì)應(yīng)的request類,類名稱和接口名稱對(duì)應(yīng)
//當(dāng)前調(diào)用接口名稱:alipay.trade.app.pay
AlipayTradeAppPayRequest aliRequest = new AlipayTradeAppPayRequest();
//SDK已經(jīng)封裝掉了公共參數(shù)兼贡,這里只需要傳入業(yè)務(wù)參數(shù)谷饿。
//以下方法為sdk的model入?yún)⒎绞?model和biz_content同時(shí)存在的取biz_content)。
aliRequest.setBizModel(model);
aliRequest.setNotifyUrl(NOTIFY_URL);
//這里和普通的接口調(diào)用不同横辆,使用的是sdkExecute
try {
AlipayTradeAppPayResponse aliResponse = alipayClient.sdkExecute(aliRequest);
String sign = aliResponse.getBody();
return sign;
} catch (AlipayApiException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
將生成的sign值直接返回給客戶端即可
2.關(guān)于異步通知:
異步通知為支付寶支付完成后,對(duì)服務(wù)器端發(fā)送的通知,客戶端返回的為同步通知,我們對(duì)訂單的處理需要以服務(wù)器端的信息為準(zhǔn).異步調(diào)用的接口需要參與簽名,并通過(guò)客戶端傳遞個(gè)支付寶,必須為無(wú)參的方法.對(duì)其發(fā)送的異步通知,需要進(jìn)行驗(yàn)簽,已確定支付的唯一性.
可以通過(guò)request 獲得支付寶異步通知返回的內(nèi)容:
//獲取支付寶POST過(guò)來(lái)反饋信息
Map<String,String> params = new HashMap<String,String>();
Map requestParams = request.getParameterMap();
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] + ",";
}
//亂碼解決,這段代碼在出現(xiàn)亂碼時(shí)使用茄猫。
// try {
// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
// } catch (UnsupportedEncodingException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
//}
params.put(name, valueStr);
}
boolean flag = AlipaySignature.rsaCheckV1(params, getAliPayPublicKey(), "UTF-8","RSA2");
//flag=true 則為驗(yàn)簽通過(guò),用戶可以添加自己的業(yè)務(wù)邏輯處理,并返回給支付寶服務(wù)器端success來(lái)通知其已經(jīng)驗(yàn)簽通過(guò)
3.支付寶公鑰和私鑰的生成,這不能算是一個(gè)坑,只因自己對(duì)此不了解,產(chǎn)生了誤解,需要成對(duì)生成