為了賬號安全,請及時綁定郵箱和手機立即綁定

Java 微信支付之APP支付服務端 (一)

2017.11.23 10:12 6993瀏覽
Java 微信支付之APP支付服務端 (一)

如圖所示,這是服務端要集成的所有微信接口。至于在開放平臺申請就不做贅述了。主要流程,1.下單,2.異步通知,3.查詢。
圖片描述

一、微信統一下單請求交易

/**
       * 微信統一下單請求交易
       *
       * @param userId
       * @param amount
       * @return
       */
      @RequestMapping(value=Route.Payment.WEIXIN_PAY,method=RequestMethod.POST)
      @ResponseBody
      public Response pay(@PathVariable("userId") int userId,@PathVariable("amount") String amount) {
            log.info("InfoMsg:--- 微信統一下單請求交易開始");
            Response resp = this.getReponse();
            String message = "";
            try {
                  ThirdPayBean bean = thirdPayService.findByPayId(19);
                  String mch_id = bean.getMer_no();   //商戶號
                  String notify_url = bean.getReturn_url(); //通知地址
                  PlatformMutualityManagent pmm = platformMutualityManagentService.findOne(5);
                  String appid = pmm.getClient_id();        //應用ID
                  String App_Secret = pmm.getClient_secret();
                  String nonce_str = WXPayUtil.generateNonceStr();            //隨機字符串
                  String sign = "";                   //簽名
                  String sign_type = "MD5";                       //簽名類型
                  String body = "循心";                     //商品描述 ps:騰訊充值中心-QQ會員充值
                  String out_trade_no = OrderGeneratedUtils.getOrderNo();         //商戶訂單號
                  int total_fee = WXRandomNumberUtil.wx_format_PayAmount(amount); //交易金額
                  String spbill_create_ip = InetAddress.getLocalHost().getHostAddress(); //終端IP
                  String trade_type = "APP";          //交易類型
                  String attach = userId + "|" + bean.getBank_id();      //附加數據 ps:用戶|支付方式

                  StringBuffer sb = new StringBuffer();
                  sb.append("appid=").append(appid).append("&");
                  sb.append("attach=").append(attach).append("&");
                  sb.append("body=").append(body).append("&");
                  sb.append("mch_id=").append(mch_id).append("&");
                  sb.append("notify_url=").append(notify_url).append("&");
                  sb.append("nonce_str=").append(nonce_str).append("&");
                  sb.append("out_trade_no=").append(out_trade_no).append("&");
                  sb.append("sign_type=").append(sign_type).append("&");
                  sb.append("spbill_create_ip=").append(spbill_create_ip).append("&");
                  sb.append("total_fee=").append(total_fee).append("&");
                  sb.append("trade_type=").append(trade_type).append("&");
                  String params = sb.toString();
                  //需要簽名的數據
                  String stringSignTemp = params + "&key=" + App_Secret;
                  //MD5簽名方式
                  sign = WXPayUtil.MD5(stringSignTemp).toUpperCase();
                  Map<String, Object> map = new HashMap<>();
                  map.put("appid", appid);
                  map.put("attach", attach);
                  map.put("body", body);
                  map.put("mch_id", mch_id);
                  map.put("notify_url", notify_url);
                  map.put("nonce_str", nonce_str);
                  map.put("out_trade_no", out_trade_no);
                  map.put("sign", sign);
                  map.put("sign_type", sign_type);
                  map.put("spbill_create_ip", spbill_create_ip);
                  map.put("total_fee", total_fee);
                  map.put("trade_type", trade_type);

                  List<UHeader> theaderList = new ArrayList<>();
                  theaderList.add(new UHeader("Content-Type", "application/x-www-form-urlencoded"));
                  //Httpclient發送請求
                  String postResponse = MaryunHttpUtils.getPostResponse(weixin_pay_Url, map, theaderList);
                  //解析返回的XML數據
                  Map<String, String> response = WXPayUtil.xmlToMap(postResponse);
                  if(!response.isEmpty() && response.get("return_code").equals("SUCCESS")){
                        if(response.get("result_code").equals("SUCCESS")) {
                              boolean result = rechargeRecordService.generatedBills(response,attach);
                              if(result) {
                                    log.info("InfoMsg:--- 微信統一下單請求交易成功");
                              }
                        }else {
                              message = response.get("err_code_des");
                              log.error("errorMsg:--- 微信統一下單請求交易解析失敗" + message);
                        }
                  }else {
                        log.error("errorMsg:--- 微信統一下單請求交易解析失敗" + message);
                  }
                  log.info("InfoMsg:--- 微信統一下單請求交易結束");
                  return resp.success();
            } catch (Exception e) {
                  log.error("errorMsg:--- 微信統一下單請求交易失敗" + e.getMessage());
                  return resp.failure(e.getMessage());
            }

      }

二、微信異步通知

/**
       * 微信支付通知地址
       *
       * @param request
       * @return
       */
      @RequestMapping(value=Route.Payment.WEIXIN_PAY_NOTIFY,method=RequestMethod.POST)
      @ResponseBody
      public Response weixin_pay_notify(HttpServletRequest request) {
            log.info("infoMsg:--- 微信異步通知開始");
            Response resp = this.getReponse();
            BufferedReader reader = null;
            String wx_map = "";
            try {
                  PlatformMutualityManagent pmm = platformMutualityManagentService.findOne(5);
                  Assert.notNull(pmm);
                  String app_key = pmm.getClient_id();
              reader = request.getReader();
              String line = "";
              String xmlString = null;
              StringBuffer inputString = new StringBuffer();
              while ((line = reader.readLine()) != null) {
                  inputString.append(line);
              }
              xmlString = inputString.toString();
              request.getReader().close();
              if(!StringUtils.isBlank(xmlString)) {
                  Map<String, String> return_map = WXPayUtil.xmlToMap(xmlString);
                  //驗簽
                  if(WXPayUtil.isSignatureValid(xmlString, app_key)) {
                        if(return_map.get("return_map").equals("SUCCESS")) {
                              //TODO 賬變,修改狀態,到賬提醒
                              Double amount = Double.parseDouble(return_map.get("total_fee"));
                              String passbackParams = return_map.get("total_fee");
                              String order_no = return_map.get("out_trade_no");
                              boolean result = rechargeRecordService.updateBill(amount,passbackParams,order_no);
                              if(result) {
                                    Map<String, String> map = new HashMap<>();
                                    map.put("return_map", "SUCCESS");
                                    map.put("return_msg", "OK");
                                    wx_map = WXPayUtil.mapToXml(map);
                              }
                        }
                  }
              }
                  log.info("infoMsg:--- 微信異步通知失敗");
                  return resp.success(wx_map);
            } catch (Exception e) {
                  log.error("errorMsg:--- 微信通知失敗" + e.getMessage());
                  return resp.failure(e.getMessage());
            }
      }

三、微信支付訂單查詢

/**
       * 微信支付訂單查詢
       *
       * @param transaction_id 微信訂單號
       * @param out_trade_no  平臺訂單號
       * @return
       */
      @RequestMapping(value=Route.Payment.WEIXIN_PAY_QUERY,method=RequestMethod.POST)
      @ResponseBody
      public Response weixin_pay_query(@PathVariable("transaction_id") String transaction_id,@PathVariable("out_trade_no") String out_trade_no) {
            log.info("infoMsg:--- 微信支付訂單查詢開始");     
            Response resp = this.getReponse();
            String sign = "";
            String message = "";
            Map<String, String> return_map = null;
            try {
                  ThirdPayBean bean = thirdPayService.findByPayId(19);
                  Assert.notNull(bean);
                  String mch_id = bean.getMer_no();   //商戶號
                  PlatformMutualityManagent pmm = platformMutualityManagentService.findOne(5);
                  Assert.notNull(pmm);
                  String appid = pmm.getClient_id();        //應用ID
                  String App_Secret = pmm.getClient_secret();     
                  String nonce_str = WXPayUtil.generateNonceStr();            //隨機字符串

                  StringBuffer sb = new StringBuffer();
                  sb.append("appid=").append(appid).append("&");
                  sb.append("nonce_str=").append(nonce_str).append("&");
                  sb.append("out_trade_no=").append(out_trade_no).append("&");
                  String params = sb.toString();
                  //需要簽名的數據
                  String stringSignTemp = params + "&key=" + App_Secret;
                  //MD5簽名方式
                  sign = WXPayUtil.MD5(stringSignTemp).toUpperCase();
                  Map<String, Object> req_map = new HashMap<>();
                  req_map.put("appid", appid);
                  req_map.put("mch_id", mch_id);
                  req_map.put("transaction_id", transaction_id);
                  req_map.put("out_trade_no", out_trade_no);
                  req_map.put("nonce_str", nonce_str);
                  req_map.put("sign", sign);
                  List<UHeader> headerList = new ArrayList<>();
                  headerList.add(new UHeader("Content-Type", "application/x-www-form-urlencoded"));
                  String postResponse = MaryunHttpUtils.getPostResponse(weixin_query_Url, req_map, headerList);
                  if(StringUtils.trim(postResponse).equals("")) {
                        return_map = WXPayUtil.xmlToMap(postResponse);
                        if(!return_map.isEmpty()) {
                              String return_code = return_map.get("return_code");
                              if(return_code.equals("SUCCESS")) {
                                    String result_code = return_map.get("return_code");
                                    if(result_code.equals("SUCCESS")) {
                                          message = (String) req_map.get("trade_state_desc");
                                    }
                              }else {
                                    message = (String) req_map.get("err_code_des");
                              }
                        }
                  }
                  log.info("infoMsg:--- 微信支付訂單查詢結束");     
                  return resp.success(return_map);
            } catch (Exception e) {
                  log.error("erroroMsg:--- 微信支付訂單查詢失敗" + e.getMessage() + message);      
                  return resp.failure(e.getMessage() + message);
            }
      }

查看原文

點擊查看更多內容
19人點贊

若覺得本文不錯,就分享一下吧!

評論

相關文章推薦

正在加載中
意見反饋 幫助中心 APP下載
官方微信

舉報

0/150
提交
取消
lpl竞猜