1.支付寶已經更新添加了封裝好的簽名方法,能夠在本身的項目中直接調用進行簽名,減小了本身手動簽名產生的問題,主要是在進行方法調用時注意傳參的要求,尤爲是公鑰使用的是支付寶的公鑰,而不是APP的公鑰前端
支付寶鼓勵使用SDK進行簽名,通常調用RSA2 進行簽名,並將返回的值直接傳遞給前端,調用支付寶支付,舉個例子:服務器
組裝參數:app
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); model.setBody("支付寶支付"); model.setSubject("App支付測試Java"); model.setOutTradeNo(order.getOrderNumber()); model.setTimeoutExpress("30m"); model.setTotalAmount(String.valueOf(order.getPrice())); model.setProductCode("QUICK_MSECURITY_PAY"); tring sign = creatAliPaySign(model);//調用生成簽名的方法
調用簽名方法,將組裝好的參數傳遞給簽名方法:異步
if(model!=null){ //實例化客戶端 AlipayClient alipayClient = new DefaultAlipayClient(ALIPAY_URL, APP_ID, APP_PRIVATE_KEY, ALIPAY_FORMAT, ALIPAY_CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE); //實例化具體API對應的request類,類名稱和接口名稱對應,當前調用接口名稱:alipay.trade.app.pay AlipayTradeAppPayRequest aliRequest = new AlipayTradeAppPayRequest(); //SDK已經封裝掉了公共參數,這裏只須要傳入業務參數。如下方法爲sdk的model入參方式(model和biz_content同時存在的狀況下取biz_content)。 aliRequest.setBizModel(model); aliRequest.setNotifyUrl(NOTIFY_URL); //這裏和普通的接口調用不一樣,使用的是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.關於異步通知:spa
異步通知爲支付寶支付完成後,對服務器端發送的通知,客戶端返回的爲同步通知,咱們對訂單的處理須要以服務器端的信息爲準.異步調用的接口須要參與簽名,並經過客戶端傳遞個支付寶,必須爲無參的方法.對其發送的異步通知,須要進行驗籤,已肯定支付的惟一性.code
能夠經過request 得到支付寶異步通知返回的內容:blog
//獲取支付寶POST過來反饋信息
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] + ","; } //亂碼解決,這段代碼在出現亂碼時使用。 // 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);
}
須要特別注意的是對亂碼的處理,當返回結果沒有亂碼的時候,須要註釋這段代碼,否則會出來驗籤失敗的狀況.接口
對返回數據進行驗籤:ip
boolean flag = AlipaySignature.rsaCheckV1(params, getAliPayPublicKey(), "UTF-8","RSA2"); //flag=true 則爲驗籤經過,用戶能夠添加本身的業務邏輯處理,並返回給支付寶服務器端success來通知其已經驗籤經過
3.支付寶公鑰和私鑰的生成,這不能算是一個坑,只因本身對此不瞭解,產生了誤解,須要成對生成