后台回调支付宝
https://blog.csdn.net/u012552275/article/details/78320051 網上找了一個可以起吊支付寶的appdemo ,它集成了服務器端,我先將其分離為app和服務器端,保證app在接收參數后可以啟調支付寶
(保證app這邊是正確的 不然出錯都不知道是服務器出錯還是app出錯),在
找網上資料修改服務器端,做好app請求接口,和支付寶的服務器回調接口@RequestMapping("pay2.do")@ResponseBodypublic Object pay2(String money){try{AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipaydev.com/gateway.do",PropertiesAlipayUtil.getProperty("appid"),PropertiesAlipayUtil.getProperty("private_key"),"json","UTF-8",PropertiesAlipayUtil.getProperty("public_key"),"RSA2");AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();model.setOutTradeNo(getOutTradeNo() + "");// 訂單號。model.setTimeoutExpress("30m");// 設置未付款支付寶交易的超時時間,一旦超時,該筆交易就會自動被關閉。當用戶進入支付寶收銀臺頁面(不包括登錄頁面),會觸發即刻創建支付寶交易,此時開始計時。取值范圍:1m~15d。m-分鐘,h-小時,d-天,1c-當天(1c-當天的情況下,無論交易何時創建,都在0點關閉)。// 該參數數值不接受小數點, 如 1.5h,可轉換為 90m。model.setTotalAmount("0.01");// 訂單總金額,單位為元,精確到小數點后兩位,取值范圍[0.01,100000000]這里調試每次支付1分錢,在項目上線前應將此處改為訂單的總金額model.setProductCode("QUICK_MSECURITY_PAY");// 銷售產品碼,商家和支付寶簽約的產品碼,為固定值QUICK_MSECURITY_PAYrequest.setBizModel(model);request.setNotifyUrl(PropertiesUtil.getProperty("alipay.callback.url.app")); // 設置后臺異步通知的地址,在手機端支付成功后支付寶會通知后臺,手機端的真實支付結果依賴于此地址// 根據不同的產品model.setBody("body");// 對一筆交易的具體描述信息。如果是多種商品,請將商品描述字符串累加傳給body。model.setSubject("111商品的標題/交易標題/訂單標題/訂單關鍵字等");//break;// 這里和普通的接口調用不同,使用的是sdkExecuteAlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);// 可以直接給客戶端請求,無需再做處理。
// orders.setAliPayOrderString(response.getBody());
// baseResult.setData(orders);Map map = new HashMap();
// map.put("code",201);
// map.put("message","支付寶下單失敗");map.put("orderString",response.getBody());return map;}catch (Exception e){e.printStackTrace();
// baseResult.setState(-999);
// baseResult.setMsg("程序異常!");
// baseResult.setSuccess(false);
// logger.error(e.getMessage());System.out.println("程序異常!");}return null;}@RequestMapping("alipay_callback.do")@ResponseBodypublic Object alipayCallback(HttpServletRequest request){System.out.println("alipay_callback 回調了"+request);//返回object 因為可能不止是字符串 這個要返回 alipay 按要求的格式返回//支付寶的回調會放到request中供 我們自己取 只要一個參數就好了//自己從新組裝mapMap<String, String> params = Maps.newHashMap();//支付寶將回調放request中是數組Map<String, String[]> parameterParams = request.getParameterMap();for(Iterator iterator = parameterParams.keySet().iterator(); iterator.hasNext();){String key = (String) iterator.next();String[] values = parameterParams.get(key);//支付寶將回調放request中是數組String valueStr = "";for(int i = 0; i < values.length ; i++){//遍歷數組 拼接之后 1,2,3,4valueStr = (i == values.length -1)? valueStr + values[i]: valueStr + values[i]+",";}自己從新組裝mapparams.put(key,valueStr);}logger.info("支付寶回調,sign:{},trade_status:{},參數:{}",params.get("sign"),params.get("trade_status"),params.toString());//驗證是不是我們的訂單號 總價是不是對的 數量是不是對的 等等//非常重要,驗證回調的正確性,是不是支付寶發的,并且能還要避免重復通知,這個說了好多次了ppt里面//我們使用rsa2 256位的進行驗證 ctrl+shift+t 查class ctrl+o 查方法params.remove("sign_type");try {
// boolean alipoayRSACheckedV2 = AlipaySignature.rsaCheckV2(params, Configs.getAlipayPublicKey(),"utf-8",Configs.getSignType());boolean alipoayRSACheckedV2 = AlipaySignature.rsaCheckV1(params,PropertiesAlipayUtil.getProperty("public_key"),"utf-8", "RSA2");if(!alipoayRSACheckedV2){return ServerResponse.createByErrorMessage("驗證不通過,非法請求,在惡意請求我就報網警了");}} catch (AlipayApiException e) {logger.error("支付寶驗證回調異常",e);}//todo 驗證各種數據 如果正確 減少庫存 增加訂單 修改狀態 在service層做 你們下去自己做吧ServerResponse serverResponse = iOrderService.aliCallback(params);if(serverResponse.isSuccess()){return Const.AlipayCallback.RESPONSE_SUCCESS;}return Const.AlipayCallback.RESPONSE_FAILED;}/*** 要求外部訂單號必須唯一。* @return*/public 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;}
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
- 上一篇: 怎么看一个公司robot协议()
- 下一篇: pagehelper 不分页的解决方法