支付寶支付接入-服務器端開發


入職新公司后,被安排做支付寶支付服務器端的開發,在閱讀了支付寶的開發文檔(https://docs.open.alipay.com/54/106370/)后,便開始了開發。

背景:我們公司接入支付寶支付的產品是一款視頻剪輯的APP,部分功能需要付費才能解鎖,比如去除APP水印等等。支付寶支付接入的需求就是在這個背景下產生的。

流程:

服務器端全部代碼如下:

  1 @Controller
  2 public class ClientAliPayCtrl extends BaseController {
  3 
  4     private Log log = LogFactory.getLog(this.getClass());
  5     //是否打印客戶端請求日志
  6     private static boolean isParaLog = MyConfigurer.getEvn("request.param.log.open").equals("true")?true:false;
  7     @Autowired
  8     protected ForbiddenIPService forbiddenIPService;
  9     @Autowired
 10     private AdChooseService adChooseService;
 11     @Autowired
 12     private AliPayService alipayService;
 13     @Autowired
 14     private AsyncInsertService asyncInsertService;
 15     @Autowired
 16     private ProductService productService;
 17     //public AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APP_ID, AlipayConfig.RSA2_PRIVATE_KEY,AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE);
 18     public static Map<Integer, AlipayClient> alipayClientMap = new HashMap<Integer, AlipayClient>();/**
 19      * JAVA服務端SDK生成APP支付訂單信息
 20      */
 21     @RequestMapping(value="{version}/alipay/preOrder.htm",method={RequestMethod.POST})
 22     void generateOrders(HttpServletRequest request,HttpServletResponse response,@PathVariable(value="version") String version){
 23         Map<String, Object> rMap = new HashMap<String, Object>();
 24         try {
 25             Map<String, String> reqPara = this.getReqPara(request, version, false);
 26             if(StringUtils.isBlank(reqPara.get("productId"))){
 27                 rMap.put("retCode", 0);
 28                 rMap.put("retMsg", "ERROR:productId is blank");
 29                 this.setJsonObject(response, rMap, reqPara);
 30                 return;
 31             }
 32             int productId = Integer.valueOf(reqPara.get("productId"));//*****************根據產品id查詢產品********************
 33             //SFProduct product = this.alipayService.getProductByProductId(productId);
 34             SFProduct product = InitUtil.getProduct(productId);
 35             if(product == null){
 36                 rMap.put("retCode", 0);
 37                 rMap.put("retMsg", "Product does not exist");
 38                 this.setJsonObject(response, rMap, reqPara);
 39                 return;
 40             }
 41             //*************************************
 42             String orderId = PayUtil.generateOrderId(productId);
 43             MyUtil mu = MyUtil.getInstance();
 44             String ip = PayUtil.ipHandle(reqPara);
 45             SFPayOrder payOrder = new SFPayOrder();
 46             payOrder.setPkgType(mu.getPackageTypeMapNew(reqPara.get("pkgName")));
 47             payOrder.setOrderId(orderId);//訂單號
 48             payOrder.setProductId(productId);//產品ID
 49             payOrder.setAppId(product.getAlipayAppId());//APPID
 50             payOrder.setOrderTime(mu.getCurrenTime());//訂單生成時間
 51             payOrder.setImei(reqPara.get("imei")==null?"":reqPara.get("imei"));//用戶客戶端唯一標識
 52             payOrder.setUuId(reqPara.get("uuId")==null?"":reqPara.get("uuId"));//用戶客戶端唯一標識
 53             payOrder.setSpbillCreateIp(ip);//用戶IP地址
 54             payOrder.setTradeType(AliPayConstant.TRADE_TYPE);
 55             payOrder.setPayStatus(-1);//支付狀態1.成功,0.失敗
 56             payOrder.setOrderMsg("OK");
 57             payOrder.setOrderStatus(1);
 58             payOrder.setMchId(product.getAlipayPid());
 59             payOrder.setTotalFee(product.getProductPrice());
 60             payOrder.setTimeStamp(System.currentTimeMillis()+"");
 61             payOrder.setPayType(2);/**************************調用支付寶接口,生成支付寶訂單******************************/
 62             AlipayTradeAppPayRequest alipayTradeAppPayRequest = new AlipayTradeAppPayRequest();
 63             //SDK已經封裝掉了公共參數,這里只需要傳入業務參數。以下方法為sdk的model入參方式(model和biz_content同時存在的情況下取biz_content)。
 64             AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
 65             model.setBody(product.getProductName());
 66             model.setSubject(product.getProductName());
 67             model.setOutTradeNo(orderId);
 68             model.setTimeoutExpress("30m");
 69             model.setTotalAmount(PayUtil.f2y(product.getProductPrice()));
 70             model.setProductCode("QUICK_MSECURITY_PAY");
 71             alipayTradeAppPayRequest.setBizModel(model);
 72             alipayTradeAppPayRequest.setNotifyUrl(MyConfigurer.getEvn("alipay.notifyUrl"));//異步通知地址
 73             String orderString = null;try {
 74                 AlipayClient alipayClient = null;
 75                 if(alipayClientMap!=null && alipayClientMap.containsKey(productId)){
 76                     alipayClient = alipayClientMap.get(productId);
 77                 }
 78                 if(alipayClient==null){
 79                     alipayClient = new DefaultAlipayClient(AlipayConfig.URL, product.getAlipayAppId(), product.getAlipayPrivateKey(),AlipayConfig.FORMAT, AlipayConfig.CHARSET, product.getAlipayPublicKey(), AlipayConfig.SIGNTYPE);
 80                     alipayClientMap.put(productId, alipayClient);
 81                 }
 82                 AlipayTradeAppPayResponse alipayTradeAppPayResponse = alipayClient.sdkExecute(alipayTradeAppPayRequest);
 83                 orderString = alipayTradeAppPayResponse.getBody();// 就是orderString,可以直接給客戶端請求,無需再做處理。
 84             } catch (AlipayApiException e) {e.printStackTrace();
 85                 rMap.put("retCode", 0);
 86                 rMap.put("retMsg", e.getMessage());
 87                 rMap.put("retMsgCode", e.getErrCode());
 88                 this.setJsonObject(response, rMap, reqPara);
 89 
 90                 payOrder.setOrderStatus(0);
 91                 payOrder.setOrderMsg(e.getMessage());
 92                 asyncInsertService.addInsertObject(payOrder);
 93                 return;
 94             }/*************************組織響應數據***************************************/
 95             rMap.put("retCode", 1);
 96             rMap.put("retMsg", "success");
 97             rMap.put("out_trade_no", orderId);
 98             rMap.put("orderString", orderString);
 99             this.setJsonObject(response, rMap, reqPara);
100             this.alipayService.saveOrderInfoToLocal(payOrder);
101         } catch (Exception e) {
102             e.printStackTrace();
103             this.errorAjax(response, e);
104         }
105     }/**
106      * app向服務端請求本次訂單支付結果,服務端向支付寶發送請求獲取結果,返回給app
107      * @param request
108      * @param response
109      * @param version
110      */
111     @RequestMapping(value="{version}/alipay/queryOrderStatus.htm",method={RequestMethod.POST})
112     void queryOrderStatus(HttpServletRequest request,HttpServletResponse response,@PathVariable(value="version") String version){
113         Map<String,Object> rMap = new HashMap<String, Object>();
114         try {
115             Map<String, String> reqPara = this.getReqPara(request, version, false);
116             //簡單校驗String out_trade_no = reqPara.get("out_trade_no");
117             if(StringUtils.isBlank(out_trade_no)){
118                 rMap.put("retCode", 0);
119                 rMap.put("retMsg", "out_trade_no is blank");
120                 this.setJsonObject(response, rMap, reqPara);
121                 return;
122             }
123             String trade_no = reqPara.get("trade_no");
124             int productId = reqPara.get("productId")==null?1001:Integer.valueOf(reqPara.get("productId"));
125             if(productId==0){
126                 productId = 1001;
127             }
128             MyUtil mu = MyUtil.getInstance();
129             Date cdate = mu.getCurrenTime();//查詢數據庫訂單狀態
130             SFPayOrder sfPayOrder = this.alipayService.getSFPayOrderByOrderId(out_trade_no);
131             if(sfPayOrder!= null && sfPayOrder.getPayStatus()!=-1){
132                 rMap.put("retCode", 1);
133                 rMap.put("retMsg", sfPayOrder.getPayMsg());
134                 this.setJsonObject(response, rMap, reqPara);
135                 sfPayOrder.setQueryStatus(1);
136                 sfPayOrder.setQueryTime(cdate);
137                 this.asyncInsertService.updateObject(sfPayOrder);
138                 return;
139             }//調用接口查詢
140             AlipayTradeQueryRequest alipayTradeQueryRequest = new AlipayTradeQueryRequest();
141             AlipayTradeQueryModel model = new AlipayTradeQueryModel();
142             model.setOutTradeNo(out_trade_no);
143             model.setTradeNo(trade_no);
144             alipayTradeQueryRequest.setBizModel(model);
145 
146             SFProduct product = InitUtil.getProduct(productId);
147             if(product == null){
148                 rMap.put("retCode", 0);
149                 rMap.put("retMsg", "Product does not exist " + productId);
150                 this.setJsonObject(response, rMap, reqPara);
151                 return;
152             }AlipayClient alipayClient = null;
153             if(alipayClientMap!=null && alipayClientMap.containsKey(productId)){
154                 alipayClient = alipayClientMap.get(productId);
155             }
156             if(alipayClient==null){
157                 alipayClient = new DefaultAlipayClient(AlipayConfig.URL, product.getAlipayAppId(), product.getAlipayPrivateKey(),AlipayConfig.FORMAT, AlipayConfig.CHARSET, product.getAlipayPublicKey(), AlipayConfig.SIGNTYPE);
158                 alipayClientMap.put(productId, alipayClient);
159             }
160             SFPayOrder payOrder = this.alipayService.getSFPayOrderByOrderId(out_trade_no);
161             AlipayTradeQueryResponse alipayTradeQueryResponse;
162             try{
163                 alipayTradeQueryResponse = alipayClient.execute(alipayTradeQueryRequest);}catch (Exception e){
164                 if (payOrder != null) {
165                     payOrder.setQueryTime(cdate);
166                     payOrder.setQueryStatus(2);
167                     this.alipayService.updateSFPayOrder(payOrder);
168                 }
169                 rMap.put("retCode", 0);
170                 rMap.put("retMsg", "An error occurred");
171                 this.setJsonObject(response, rMap, reqPara);
172                 return;
173             }
174             if (alipayTradeQueryResponse.isSuccess()) {trade_no = alipayTradeQueryResponse.getTradeNo();
175                 String orderStatus = alipayTradeQueryResponse.getTradeStatus();
176                 if("TRADE_SUCCESS".equals(orderStatus) || "TRADE_FINISHED".equals(orderStatus)){//交易成功
177                     rMap.put("retCode", 1);
178                     rMap.put("retMsg", orderStatus);
179                     this.setJsonObject(response, rMap, reqPara);
180                 }else{//交易失敗
181                     rMap.put("retCode", 0);
182                     rMap.put("retMsg", orderStatus);
183                     this.setJsonObject(response, rMap, reqPara);
184                 }if(payOrder == null){
185                     payOrder = new SFPayOrder();
186                     payOrder.setOrderMsg("OK");
187                     payOrder.setOrderStatus(1);
188                     payOrder.setPkgType(mu.getPackageTypeMapNew(reqPara.get("pkgName")));
189                     payOrder.setTransactionId(alipayTradeQueryResponse.getTradeNo());
190                     payOrder.setOrderId(out_trade_no);
191                     payOrder.setOpenId(alipayTradeQueryResponse.getBuyerUserId());
192                     payOrder.setUserAccount(alipayTradeQueryResponse.getBuyerLogonId());
193                     payOrder.setPayTime(alipayTradeQueryResponse.getSendPayDate());
194                     payOrder.setPayStatus(Integer.parseInt(alipayTradeQueryResponse.getTradeStatus()));
195                     payOrder.setAppId(product.getAlipayAppId());
196                     payOrder.setPayMsg(orderStatus);
197                     payOrder.setPayStatus("TRADE_SUCCESS".equals(orderStatus) || "TRADE_FINISHED".equals(orderStatus)?1:0);
198                     this.alipayService.saveOrderInfoToLocal(payOrder);
199                 }else{payOrder.setQueryStatus(1);
200                     payOrder.setQueryTime(cdate);
201                     payOrder.setTransactionId(alipayTradeQueryResponse.getTradeNo());
202                     payOrder.setOpenId(alipayTradeQueryResponse.getBuyerUserId());
203                     payOrder.setUserAccount(alipayTradeQueryResponse.getBuyerLogonId());
204                     payOrder.setPayTime(alipayTradeQueryResponse.getSendPayDate());
205 
206                     /*交易狀態:
207                      * WAIT_BUYER_PAY(交易創建,等待買家付款)、
208                      * TRADE_CLOSED(未付款交易超時關閉,或支付完成后全額退款)、
209                      * TRADE_SUCCESS(交易支付成功)、
210                      * TRADE_FINISHED(交易結束,不可退款)*/
211                     payOrder.setPayMsg(orderStatus);
212                     payOrder.setPayStatus("TRADE_SUCCESS".equals(orderStatus) || "TRADE_FINISHED".equals(orderStatus)?1:0);
213                     this.alipayService.updateSFPayOrder(payOrder);
214                 }} else {rMap.put("retCode", 0);
215                 rMap.put("retMsg", alipayTradeQueryResponse.getSubMsg());
216                 this.setJsonObject(response, rMap, reqPara);
217                 //交易不存在
218                 if ("ACQ.TRADE_NOT_EXIST".equals(alipayTradeQueryResponse.getSubCode())){
219                     if (payOrder != null) {
220                         payOrder.setQueryStatus(1);
221                         payOrder.setOrderStatus(0);
222                         payOrder.setPayStatus(0);
223                         payOrder.setQueryTime(cdate);
224                         this.alipayService.updateSFPayOrder(payOrder);
225                     }}else {
226                     if (payOrder != null) {
227                         payOrder.setQueryTime(cdate);
228                         payOrder.setQueryStatus(2);
229                         this.alipayService.updateSFPayOrder(payOrder);
230                     }
231                 }
232             }
233         } catch (Exception e) {
234             e.printStackTrace();
235         }
236     }@RequestMapping("/aliPay/updateCheckOrderStatus.htm")
237     public void updateOrderStatus(HttpServletRequest request, HttpServletResponse response) {
238         try {
239             Map<String, String> reqPara = this.getAjaxParas(request);
240             Map<String, Object> rMap = new HashMap<String, Object>();
241             String out_trade_no = reqPara.get("orderId");
242             int productId = reqPara.get("productId")==null?1001:Integer.valueOf(reqPara.get("productId"));
243             if(productId==0){
244                 productId = 1001;
245             }MyUtil mu = MyUtil.getInstance();
246             Date cdate = mu.getCurrenTime();
247             //查詢數據庫訂單狀態
248             SFPayOrder payOrder = this.alipayService.getSFPayOrderByOrderId(out_trade_no);
249             if(payOrder == null){
250                 rMap.put("info","error");
251                 this.setJsonObject(response,rMap);
252                 return;
253             }
254             //調用接口查詢
255             AlipayTradeQueryRequest alipayTradeQueryRequest = new AlipayTradeQueryRequest();
256             AlipayTradeQueryModel model = new AlipayTradeQueryModel();
257             model.setOutTradeNo(out_trade_no);//model.setTradeNo(trade_no);
258             alipayTradeQueryRequest.setBizModel(model);
259 
260             SFProduct product = InitUtil.getProduct(productId);
261             if(product == null){
262                 rMap.put("info","error");
263                 this.setJsonObject(response,rMap);
264                 return;
265             }
266             AlipayClient alipayClient = null;
267             if(alipayClientMap!=null && alipayClientMap.containsKey(productId)){
268                 alipayClient = alipayClientMap.get(productId);
269             }if(alipayClient==null){
270                 alipayClient = new DefaultAlipayClient(AlipayConfig.URL, product.getAlipayAppId(), product.getAlipayPrivateKey(),AlipayConfig.FORMAT, AlipayConfig.CHARSET, product.getAlipayPublicKey(), AlipayConfig.SIGNTYPE);
271                 alipayClientMap.put(productId, alipayClient);
272             }
273 //            AlipayTradeQueryResponse alipayTradeQueryResponse = alipayClient.execute(alipayTradeQueryRequest);
274             AlipayTradeQueryResponse alipayTradeQueryResponse;
275             try{
276                 alipayTradeQueryResponse = alipayClient.execute(alipayTradeQueryRequest);
277             }catch (Exception e){
278                 if (payOrder != null) {
279                     payOrder.setQueryTime(cdate);payOrder.setQueryStatus(2);
280                     this.alipayService.updateSFPayOrder(payOrder);
281                 }
282                 rMap.put("retCode", 0);
283                 rMap.put("retMsg", "An error occurred");
284                 this.setJsonObject(response, rMap, reqPara);
285                 return;
286             }
287             log.info(alipayTradeQueryResponse.toString());if (alipayTradeQueryResponse.isSuccess()) {
288 String orderStatus = alipayTradeQueryResponse.getTradeStatus();
289                 log.info(orderStatus);
290                 payOrder.setTransactionId(alipayTradeQueryResponse.getTradeNo());
291                 payOrder.setOpenId(alipayTradeQueryResponse.getBuyerUserId());
292                 payOrder.setUserAccount(alipayTradeQueryResponse.getBuyerLogonId());
293                 payOrder.setPayTime(new Date());
294 payOrder.setPayMsg(orderStatus);
295                 payOrder.setPayStatus("TRADE_SUCCESS".equals(orderStatus) || "TRADE_FINISHED".equals(orderStatus)?1:0);
296                 this.alipayService.updateSFPayOrder(payOrder);
297                 rMap.put("info", "ok");
298             } else {
299 if ("ACQ.TRADE_NOT_EXIST".equals(alipayTradeQueryResponse.getSubCode())){
300                     if (payOrder != null) {
301                         payOrder.setOrderStatus(0);
302                         payOrder.setQueryStatus(1);
303                         payOrder.setQueryTime(cdate);
304                         payOrder.setPayStatus(0);
305                         this.alipayService.updateSFPayOrder(payOrder);
306                     }
307                 }else {
308                     if (payOrder != null) {
309                         payOrder.setQueryTime(cdate);
310                         payOrder.setQueryStatus(2);
311                         this.alipayService.updateSFPayOrder(payOrder);
312                     }
313                 }
314 rMap.put("info", "alipayError");
315             }
316             this.setJsonObject(response, rMap);
317         } catch (Exception e) {
318             e.printStackTrace();
319         }
320     }
321 /**
322      * 檢查恢復購買
323      * @param request
324      * @param response
325      * @param version
326      */
327     @RequestMapping(value="{version}/alipay/checkRePurchase.htm",method={RequestMethod.POST})
328     void checkRepurchase(HttpServletRequest request,HttpServletResponse response,@PathVariable(value="version") String version){
329         Map<String,Object> rMap = new HashMap<String, Object>();
330         try {
331             Map<String, String> reqPara = this.getReqPara(request, version, false);
332             String openId = reqPara.get("openId");//用戶支付寶唯一標識
333             if(StringUtils.isBlank(openId)){
334 rMap.put("retCode", 0);
335                 rMap.put("retMsg", "Error openId!");
336                 this.setJsonObject(response, rMap, reqPara);
337                 return;
338             }
339             /**
340              * 獲得app傳入的用戶唯一標識,產品唯一標識,產品購買渠道標識,查詢數據庫,檢驗用戶是否已購買該服務,返回結果給app端
341              * */
342             MyUtil mu = MyUtil.getInstance();
343             Date ctime = mu.getCurrenTime();
344             // 組織查詢訂單的請求數據
345             try {
346 //先查詢是否支付寶支付回調結果,不存在平台查詢支付結果
347                 SFPayOrder payOrder = productService.getPayOrderByOpenId(openId);
348                 SFPayQueryOpenidLog queryOpenidLog = new SFPayQueryOpenidLog();
349                 if(payOrder!=null){
350                     if(-1==payOrder.getPayStatus()){
351                         SFProduct product = InitUtil.getProduct(payOrder.getProductId());
352                         if(product == null){
353                             rMap.put("retCode", 0);
354                             rMap.put("retMsg", "Product does not exist " + payOrder.getProductId());
355                             this.setJsonObject(response, rMap, reqPara);
356                             return;
357                         }
358 //調用接口查詢
359                         Date cdate = mu.getCurrenTime();
360                         AlipayTradeQueryRequest alipayTradeQueryRequest = new AlipayTradeQueryRequest();
361                         AlipayTradeQueryModel model = new AlipayTradeQueryModel();
362                         model.setOutTradeNo(payOrder.getOrderId());
363                         alipayTradeQueryRequest.setBizModel(model);
364                         AlipayClient alipayClient = null;
365                         if(alipayClientMap!=null && alipayClientMap.containsKey(payOrder.getProductId())){
366                             alipayClient = alipayClientMap.get(payOrder.getProductId());
367                         }
368                         if(alipayClient==null){
369                             alipayClient = new DefaultAlipayClient(AlipayConfig.URL, product.getAlipayAppId(), product.getAlipayPrivateKey(),AlipayConfig.FORMAT, AlipayConfig.CHARSET, product.getAlipayPublicKey(), AlipayConfig.SIGNTYPE);
370                             alipayClientMap.put(payOrder.getProductId(), alipayClient);
371                         }
372 AlipayTradeQueryResponse alipayTradeQueryResponse;
373                         try{
374                             alipayTradeQueryResponse = alipayClient.execute(alipayTradeQueryRequest);
375                         }catch (Exception e){
376                             if (payOrder != null) {
377                                 payOrder.setQueryTime(cdate);
378                                 payOrder.setQueryStatus(2);
379                                 this.alipayService.updateSFPayOrder(payOrder);
380                             }
381                             rMap.put("retCode", 0);
382                             rMap.put("retMsg", "An error occurred");
383                             this.setJsonObject(response, rMap, reqPara);
384                             return;
385                         }
386 if (alipayTradeQueryResponse.isSuccess()) {
387                             String orderStatus = alipayTradeQueryResponse.getTradeStatus();
388                             if("TRADE_SUCCESS".equals(orderStatus) || "TRADE_FINISHED".equals(orderStatus)){//交易成功
389                                 rMap.put("retCode", 1);
390                                 rMap.put("retMsg", orderStatus);
391                             }else{//交易失敗
392                                 rMap.put("retCode", 0);
393                                 rMap.put("retMsg", orderStatus);
394                             }
395                             this.setJsonObject(response, rMap, reqPara);
396 
397                             payOrder.setPayStatus("TRADE_SUCCESS".equals(orderStatus) || "TRADE_FINISHED".equals(orderStatus)?1:0);
398                             payOrder.setOrderStatus(1);//訂單狀態默認成功
399                             payOrder.setQueryStatus(1);
400                             payOrder.setQueryTime(cdate);
401 payOrder.setTransactionId(alipayTradeQueryResponse.getTradeNo());
402                             payOrder.setOpenId(alipayTradeQueryResponse.getBuyerUserId());
403                             payOrder.setUserAccount(alipayTradeQueryResponse.getBuyerLogonId());
404                             payOrder.setPayTime(alipayTradeQueryResponse.getSendPayDate());
405                             payOrder.setPayMsg(orderStatus);
406                             this.alipayService.updateSFPayOrder(payOrder);
407                         } else {
408                             rMap.put("retCode", 0);
409                             rMap.put("retMsg", alipayTradeQueryResponse.getSubMsg());
410                             this.setJsonObject(response, rMap, reqPara);
411                             //交易不存在
412 if ("ACQ.TRADE_NOT_EXIST".equals(alipayTradeQueryResponse.getSubCode())){
413                                 if (payOrder != null) {
414                                     payOrder.setQueryStatus(1);
415                                     payOrder.setOrderStatus(0);
416                                     payOrder.setQueryTime(cdate);
417                                     payOrder.setPayStatus(0);
418                                     this.alipayService.updateSFPayOrder(payOrder);
419                                 }
420                             }else {
421                                 if (payOrder != null) {
422                                     payOrder.setQueryTime(cdate);
423                                     payOrder.setQueryStatus(2);
424                                     this.alipayService.updateSFPayOrder(payOrder);
425                                 }
426                             }
427                         }
428                         return;
429                     }
430 // 支付成功
431                     rMap.put("retCode", payOrder.getPayStatus()==1?1:0);
432                     rMap.put("retMsg", payOrder.getPayMsg());
433                     //rMap.put("failStatus", 0);
434                     if(payOrder.getQueryStatus()!=1){
435                         payOrder.setQueryStatus(1);
436                         payOrder.setQueryTime(ctime);
437                         asyncInsertService.updateObject(payOrder);
438                     }
439 queryOpenidLog.setoId(payOrder.getId());
440                     queryOpenidLog.setOrderId(payOrder.getOrderId());
441                     queryOpenidLog.setPayStatus(payOrder.getPayStatus());
442                     queryOpenidLog.setTransactionId(payOrder.getTransactionId());
443                     if(payOrder.getPayStatus()==1){
444                         queryOpenidLog.setQueryStatus(1);
445                     }else{
446                         queryOpenidLog.setQueryStatus(0);
447                     }
448                 }else{
449                     // 平台支付回調結果
450                     rMap.put("retCode", 0);
451                     rMap.put("retMsg", "Not pay data!");
452                     //rMap.put("failStatus", 0);
453                     queryOpenidLog.setQueryStatus(0);
454                 }
455 this.setJsonObject(response, rMap, reqPara);
456 
457                 queryOpenidLog.setCtime(ctime);
458                 queryOpenidLog.setImei(reqPara.get("imei"));
459                 queryOpenidLog.setUuId(reqPara.get("uuId"));
460                 queryOpenidLog.setOpenId(openId);
461                 queryOpenidLog.setSpbillCreateIp(reqPara.get("clientIp"));
462                 queryOpenidLog.setUserAgent(request.getHeader("User-Agent"));
463                 if(mu.isNumber(reqPara.get("versionCode"))){
464                     queryOpenidLog.setVersionCode(Integer.valueOf(reqPara.get("versionCode")));
465                 }
466                 if(mu.isNumber(reqPara.get("osType"))){
467                     queryOpenidLog.setOsType(Integer.valueOf(reqPara.get("osType")));
468                 }
469                 queryOpenidLog.setVersionName(reqPara.get("versionName"));
470                 this.asyncInsertService.addInsertObject(queryOpenidLog);
471 
472                 log.debug("結束調用支付寶訂單openId查詢接口...");
473             } catch (Exception e) {
474                 rMap.put("retCode", 0);
475                 rMap.put("retMsg", "fail 查詢失敗");
476                 rMap.put("failStatus", 1);
477                 response.setStatus(203);
478                 this.setJsonObject(response, rMap, reqPara);
479             }
480         } catch (Exception e) {
481             e.printStackTrace();
482         }
483     }
484     /**
485      * 應用網關,用於接收支付寶異步通知
486      * @throws UnsupportedEncodingException
487      * @throws ParseException
488      */
489     @RequestMapping(value="/alipay/getAsyncAliPayNotice.htm",method={RequestMethod.POST,RequestMethod.GET})
490     void getAsyncAliPayNotice(HttpServletRequest request,HttpServletResponse response) throws UnsupportedEncodingException, ParseException, AlipayApiException{    //獲取支付寶POST過來反饋信息
491         log.info("-----------------------------------start get alipay async info----------------------------------------------------------");
492         Map<String,String> params = new HashMap<String,String>();
493         Map requestParams = request.getParameterMap();
494         for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
495             String name = (String) iter.next();
496             String[] values = (String[]) requestParams.get(name);
497             String valueStr = "";
498 for (int i = 0; i < values.length; i++) {
499                 valueStr = (i == values.length - 1) ? valueStr + values[i]
500                         : valueStr + values[i] + ",";
501             }
502             //亂碼解決,這段代碼在出現亂碼時使用。如果mysign和sign不相等也可以使用這段代碼轉化
503             //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
504             params.put(name, valueStr);
505         }
506         log.info("支付寶異步通知:["+params.toString()+"]");
507 
508         //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以下僅供參考)//
509         String trade_no = request.getParameter("trade_no"); // 支付寶交易號
510         String out_trade_no = request.getParameter("out_trade_no"); // 獲取訂單號
511         String notify_time = request.getParameter("notify_time"); // 通知的發送時間。格式為yyyy-MM-dd HH:mm:ss
512 String trade_status = request.getParameter("trade_status"); // 交易狀態
513         String buyer_id = request.getParameter("buyer_id"); // 買家支付寶賬號對應的支付寶唯一用戶號。
514         String buyer_logon_id = request.getParameter("buyer_logon_id"); // 買家支付寶賬號
515         String payAppId = (request.getParameter("app_id")+"").trim();
516         //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以上僅供參考)//
517         try {
518             boolean flag = AlipaySignature.rsaCheckV1(params, InitUtil.getPayApiKey("ali"+payAppId), AlipayConfig.CHARSET,AlipayConfig.SIGNTYPE);
519             response.setContentType("text/plain;charset=utf-8");
520             PrintWriter responseStream = response.getWriter();
521             SFPayOrder payOrder = this.alipayService.getSFPayOrderByOrderId(out_trade_no);
522             if(flag){//驗證簽名通過
523                 if(payOrder != null){//記錄存在
524                     if("TRADE_FINISHED".equals(trade_status) || "TRADE_SUCCESS".equals(trade_status)){  //交易成功
525 payOrder.setPayStatus(1);
526                     }else{
527                         payOrder.setPayStatus(0);
528                     }
529                     payOrder.setUserAccount(buyer_logon_id);
530                     payOrder.setOpenId(buyer_id);
531                     payOrder.setTransactionId(trade_no);
532                     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
533                     payOrder.setPayMsg(trade_status);
534                     payOrder.setPayTime(sdf.parse(notify_time));
535                     payOrder.setNotifyTime(new Date());
536                     this.alipayService.updateSFPayOrder(payOrder);
537                 }else{//本地數據庫中沒有該條記錄,基本上不會執行此步驟
538                     payOrder = new SFPayOrder();
539                     payOrder.setOrderStatus(1);
540                     if("TRADE_FINISHED".equals(trade_status) || "TRADE_SUCCESS".equals(trade_status)){  //交易成功
541 payOrder.setPayStatus(1);
542                     }else{
543                         payOrder.setPayStatus(0);
544                     }
545                     payOrder.setOrderMsg("OK");
546                     payOrder.setPkgType(InitUtil.payPkgTypeMap.get("ali"+payAppId));
547                     payOrder.setOrderId(out_trade_no);
548 
549                     payOrder.setUserAccount(buyer_logon_id);
550                     payOrder.setOpenId(buyer_id);
551                     payOrder.setTransactionId(trade_no);
552                     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
553                     payOrder.setPayMsg(trade_status);
554                     payOrder.setPayTime(sdf.parse(notify_time));
555                     payOrder.setNotifyTime(new Date());
556                     this.alipayService.saveOrderInfoToLocal(payOrder);
557                 }
558                 responseStream.print("success"); //請不要修改或刪除
559 }else{
560                 responseStream.print("fail");
561             }
562             responseStream.close();
563         }catch (IOException e) {
564             e.printStackTrace();
565         }
566         log.info("-----------------------------------end get alipay async info----------------------------------------------------------");
567     }
568 
569 /**
570      * APP向服務器請求支付寶認證加密信息。
571      * @throws Exception
572      */
573     @RequestMapping(value="{version}/alipay/appGetOauthInfo.htm",method={RequestMethod.POST})
574     void appGetOauthInfo(HttpServletRequest request,HttpServletResponse response,@PathVariable(value="version") String version) throws Exception{
575         Map<String, Object> rMap = new HashMap<String, Object>();
576         try {
577             Map<String, String> reqPara = this.getReqPara(request, version, false);
578             int productId = reqPara.get("productId")==null?1001:Integer.valueOf(reqPara.get("productId"));
579             if(productId==0){
580                 productId = 1001;
581             }
582             //*****************根據產品id查詢產品********************
583             //SFProduct product = this.alipayService.getProductByProductId(productId);
584             SFProduct product = InitUtil.getProduct(productId);
585             if(product == null){
586     rMap.put("retCode", 0);
587                 rMap.put("retMsg", "Product does not exist");
588                 this.setJsonObject(response, rMap, reqPara);
589                 return;
590             }
591             //*************************************
592             boolean rsa2 = true ;//app通知服務器加密方式
593             Map<String, String> authInfoMap = OrderInfoUtil2_0.buildAuthInfoMap(product.getAlipayPid(), product.getAlipayAppId(), product.getAlipayTargetId(), rsa2);
594             String info = OrderInfoUtil2_0.buildOrderParam(authInfoMap);
595             String privateKey = rsa2 ? product.getAlipayPrivateKey() : product.getAlipayPrivateKey();
596             String sign = OrderInfoUtil2_0.getSign(authInfoMap, privateKey, rsa2);
597             final String authInfo = info + "&" + sign;
598             //返回數據
599             rMap.put("retCode", 1);
600             rMap.put("retMsg", "");
601             rMap.put("authInfo", authInfo);
602             this.setJsonObject(response, rMap, reqPara);
603 } catch (Exception e) {
604             e.printStackTrace();
605             rMap.put("retCode", 0);
606             rMap.put("retMsg", "ERROR");
607             this.setJsonObject(response, rMap);
608         }
609     }
610 
611 
612 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM