專業(yè)手機網(wǎng)站制作公司網(wǎng)站快速排名服務(wù)商
一:異步通知是支付寶回調(diào)商戶的服務(wù)器,所以這個地址需要通過外網(wǎng)訪問,在真實項目中都會有對應(yīng)的服務(wù)器,但是在測試中只有使用內(nèi)網(wǎng)穿透工具
推薦使用NATAPP-內(nèi)網(wǎng)穿透 基于ngrok的國內(nèi)高速內(nèi)網(wǎng)映射工具
配置好內(nèi)網(wǎng)穿透之后不要忘記在常量類中配置異步返回的地址
二:異步通知
@RequestMapping("/alpay")
@ResponseBody
public String alpay(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {// 獲取支付寶POST過來反饋信息Map<String, String> params = new HashMap<>();Map<String, String[]> requestParams = httpServletRequest.getParameterMap();for (String name : requestParams.keySet()) {String[] values = requestParams.get( name );StringBuilder valueStr = new StringBuilder();for (String value : values) {valueStr.append( value );}params.put( name, valueStr.toString() );}// 調(diào)用支付寶SDK進行驗簽boolean verifyResult = false;try {verifyResult = AlipaySignature.rsaCheckV1( params, constant.PublicKey, "UTF-8", "RSA2" );} catch (Exception e) {e.printStackTrace();}// 驗簽通過,則處理業(yè)務(wù)邏輯if (verifyResult) {System.out.println( "異步驗證通過" );//支付String tradeStatus = params.get( "trade_status" );if (tradeStatus.equals( "TRADE_SUCCESS" )) {// 交易支付成功,處理支付成功的邏輯String orderId = params.get( "out_trade_no" );String tradeNo = params.get( "trade_no" );String total_amount = params.get( "total_amount" );System.out.println( "訂單id:" + orderId );System.out.println( "流水號:" + tradeNo );System.out.println( "支付金額:" + total_amount );
//根據(jù)訂單號調(diào)用查詢接口,查詢支付信息AlipayTradeQueryResponse query = query( params.get( "out_trade_no" ) );
//查詢支付信息,獲取支付金額和訂單金額是否一致,一致就就修改訂單狀態(tài)String totalAmount = query.getTotalAmount();if (totalAmount.equals( total_amount )) {boolean b = sysOrdersService.updateState( orderId );System.out.println( "修改數(shù)據(jù)庫訂單狀態(tài)是否成功:" + b );}}}return "success";} else {// 驗簽失敗,記錄日志或進行其他后續(xù)處理System.out.println( "異步驗證失敗" );return "failure";}
}
三:查詢交易信息接口
/*** 查詢交易信息** @param outTradeNo* @return*/public static AlipayTradeQueryResponse query(String outTradeNo) {try {AlipayClient alipayClient = new DefaultAlipayClient(constant.serverUrl,constant.appId,constant.privateKey,constant.format,constant.charset,constant.PublicKey,constant.signType );AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();JSONObject bizContent = new JSONObject();bizContent.put( "out_trade_no", outTradeNo );request.setBizContent( bizContent.toString() );AlipayTradeQueryResponse response = alipayClient.execute( request );if (response.isSuccess()) {System.out.println( "調(diào)用查詢接口成功" );return response;} else {System.out.println( "調(diào)用查詢接口失敗" );}} catch (AlipayApiException e) {e.printStackTrace();}return null;}
四:測試
查看支付寶是否調(diào)用異步通知接口,數(shù)據(jù)庫狀態(tài)是否修改
新建訂單
控制臺輸出
數(shù)據(jù)庫
狀態(tài)修改成功