• 支付宝支付接入-服务器端开发


    入职新公司后,被安排做支付宝支付服务器端的开发,在阅读了支付宝的开发文档(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
  • 相关阅读:
    解决DataGridView绑定List后不能排序的问题
    最新的皮肤下载
    我收录的名言
    HttpRequest访问Https带有证书并使用WSDL文档生成代理类方案(2)
    最新的Functions 类
    华兴软通短信接口简单使用WebServices版
    最新的SqlHelper 类
    闲来没事写个记事本玩玩!!!
    "基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系"证书验证失败的解决过程(3)
    FCK配置
  • 原文地址:https://www.cnblogs.com/wangchaoBlog/p/7986670.html
Copyright © 2020-2023  润新知