后台回调支付宝
https://blog.csdn.net/u012552275/article/details/78320051 網(wǎng)上找了一個(gè)可以起吊支付寶的appdemo ,它集成了服務(wù)器端,我先將其分離為app和服務(wù)器端,保證app在接收參數(shù)后可以啟調(diào)支付寶
(保證app這邊是正確的 不然出錯(cuò)都不知道是服務(wù)器出錯(cuò)還是app出錯(cuò)),在
找網(wǎng)上資料修改服務(wù)器端,做好app請(qǐng)求接口,和支付寶的服務(wù)器回調(diào)接口@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() + "");// 訂單號(hào)。model.setTimeoutExpress("30m");// 設(shè)置未付款支付寶交易的超時(shí)時(shí)間,一旦超時(shí),該筆交易就會(huì)自動(dòng)被關(guān)閉。當(dāng)用戶進(jìn)入支付寶收銀臺(tái)頁面(不包括登錄頁面),會(huì)觸發(fā)即刻創(chuàng)建支付寶交易,此時(shí)開始計(jì)時(shí)。取值范圍:1m~15d。m-分鐘,h-小時(shí),d-天,1c-當(dāng)天(1c-當(dāng)天的情況下,無論交易何時(shí)創(chuàng)建,都在0點(diǎn)關(guān)閉)。// 該參數(shù)數(shù)值不接受小數(shù)點(diǎn), 如 1.5h,可轉(zhuǎn)換為 90m。model.setTotalAmount("0.01");// 訂單總金額,單位為元,精確到小數(shù)點(diǎn)后兩位,取值范圍[0.01,100000000]這里調(diào)試每次支付1分錢,在項(xiàng)目上線前應(yīng)將此處改為訂單的總金額model.setProductCode("QUICK_MSECURITY_PAY");// 銷售產(chǎn)品碼,商家和支付寶簽約的產(chǎn)品碼,為固定值QUICK_MSECURITY_PAYrequest.setBizModel(model);request.setNotifyUrl(PropertiesUtil.getProperty("alipay.callback.url.app")); // 設(shè)置后臺(tái)異步通知的地址,在手機(jī)端支付成功后支付寶會(huì)通知后臺(tái),手機(jī)端的真實(shí)支付結(jié)果依賴于此地址// 根據(jù)不同的產(chǎn)品model.setBody("body");// 對(duì)一筆交易的具體描述信息。如果是多種商品,請(qǐng)將商品描述字符串累加傳給body。model.setSubject("111商品的標(biāo)題/交易標(biāo)題/訂單標(biāo)題/訂單關(guān)鍵字等");//break;// 這里和普通的接口調(diào)用不同,使用的是sdkExecuteAlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);// 可以直接給客戶端請(qǐng)求,無需再做處理。
// 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 回調(diào)了"+request);//返回object 因?yàn)榭赡懿恢故亲址? 這個(gè)要返回 alipay 按要求的格式返回//支付寶的回調(diào)會(huì)放到request中供 我們自己取 只要一個(gè)參數(shù)就好了//自己從新組裝mapMap<String, String> params = Maps.newHashMap();//支付寶將回調(diào)放request中是數(shù)組Map<String, String[]> parameterParams = request.getParameterMap();for(Iterator iterator = parameterParams.keySet().iterator(); iterator.hasNext();){String key = (String) iterator.next();String[] values = parameterParams.get(key);//支付寶將回調(diào)放request中是數(shù)組String valueStr = "";for(int i = 0; i < values.length ; i++){//遍歷數(shù)組 拼接之后 1,2,3,4valueStr = (i == values.length -1)? valueStr + values[i]: valueStr + values[i]+",";}自己從新組裝mapparams.put(key,valueStr);}logger.info("支付寶回調(diào),sign:{},trade_status:{},參數(shù):{}",params.get("sign"),params.get("trade_status"),params.toString());//驗(yàn)證是不是我們的訂單號(hào) 總價(jià)是不是對(duì)的 數(shù)量是不是對(duì)的 等等//非常重要,驗(yàn)證回調(diào)的正確性,是不是支付寶發(fā)的,并且能還要避免重復(fù)通知,這個(gè)說了好多次了ppt里面//我們使用rsa2 256位的進(jìn)行驗(yàn)證 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("驗(yàn)證不通過,非法請(qǐng)求,在惡意請(qǐng)求我就報(bào)網(wǎng)警了");}} catch (AlipayApiException e) {logger.error("支付寶驗(yàn)證回調(diào)異常",e);}//todo 驗(yàn)證各種數(shù)據(jù) 如果正確 減少庫存 增加訂單 修改狀態(tài) 在service層做 你們下去自己做吧ServerResponse serverResponse = iOrderService.aliCallback(params);if(serverResponse.isSuccess()){return Const.AlipayCallback.RESPONSE_SUCCESS;}return Const.AlipayCallback.RESPONSE_FAILED;}/*** 要求外部訂單號(hào)必須唯一。* @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;}
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)
總結(jié)
- 上一篇: 怎么看一个公司robot协议()
- 下一篇: pagehelper 不分页的解决方法