溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

微信、支付寶二碼合一掃碼支付實現(xiàn)思路(java)

發(fā)布時間:2020-09-21 14:07:58 來源:腳本之家 閱讀:350 作者:kung900519 欄目:編程語言

一、支付二維碼(預(yù)訂單)

根據(jù)需要購買的信息創(chuàng)建預(yù)訂單,將訂單信息保存到Redis中,并設(shè)置有效期,注意生產(chǎn)二維碼的鏈接后的參數(shù)可以關(guān)聯(lián)到Redis中的key;

QRCode  為servlet掃碼請求的URL;

UUIDUtils.getUUID()  為預(yù)訂單單號,在servlet請求中截取,然后在Redis中查找對應(yīng)的Key的數(shù)據(jù);

二維碼地址:http://kung900519.qicp.io/interface/QRCode/UUIDUtils.getUUID();

二、創(chuàng)建二維碼掃碼請求地址servlet:QRCodeServlet;微信支付重定向請求servlet:WechatPayServlet;支付寶重定向請求servlet:AliPayServlet;

QRCodeServlet  用于用戶使用微信或者支付寶掃碼二維碼進行客戶端識別及重定向到對應(yīng)的業(yè)務(wù)處理;

package com.platform.cloudlottery.servlet;
 
import java.io.IOException;
 
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
 
import com.platform.cloudlottery.common.CommonConfig;
import com.platform.cloudlottery.common.alipay.config.MyAliPayConfig;
import com.platform.cloudlottery.common.wechat.config.WXPublicConfig;
import com.platform.cloudlottery.common.wechat.util.HttpUtil;
import com.platform.cloudlottery.model.SysPayChannel;
import com.platform.cloudlottery.service.Impl.SysPayChannelServiceImpl;
import com.platform.cloudlottery.web.StatusContant.PayTypeConstant;
 
/**
 * @ClassName: QRCodeServlet
 * @Description: TODO(根據(jù)請求的后綴獲取該數(shù)據(jù)編碼對應(yīng)的數(shù)據(jù),并重定向到頁面)
 * @author chenkun
 * @date 2018年12月29日
 *
 */
public class QRCodeServlet extends HttpServlet {
 private static final long serialVersionUID = -8457626626670970403L;
 protected Logger logger = LoggerFactory.getLogger(getClass());
 
 private static final String UrlStr = "QRCode/";
 
 private static final String wechatPay = "wechatPay/";
 
 private static final String aliPay = "aliPay/";
 
 @Autowired
  private SysPayChannelServiceImpl payChannelService;
 
 public void init(ServletConfig servletConfig) throws ServletException {
 super.init(servletConfig);
 SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, servletConfig.getServletContext());
 }
 
 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 logger.info("####################請求開始####################");
 String userAgent = request.getHeader("user-agent");
 String RequestURL = request.getRequestURL().toString();
   logger.info("URL : " + RequestURL);
   String ReqInfo = RequestURL.substring(RequestURL.indexOf(UrlStr)+UrlStr.length());
   logger.info("URL : " + ReqInfo);
   CommonConfig commonConfig = new CommonConfig();
 if (userAgent != null && userAgent.contains("AlipayClient")) {
      logger.info("來自支付寶");
      String redirecturi = HttpUtil.urlEnCode(commonConfig.getDomain() + aliPay + ReqInfo);
      logger.info("REDIRECT_URI="+redirecturi);
      SysPayChannel channel = payChannelService.selectByChannelType(PayTypeConstant.Alipay);
      MyAliPayConfig aliPayConfig = new MyAliPayConfig();
      aliPayConfig.setAppId(channel.getAppid());
      // 授權(quán)頁面地址
      String requestUrl = aliPayConfig.getAuthgateway();
      requestUrl = requestUrl.replace("APPID", aliPayConfig.getAppId()).replace("SCOPE", aliPayConfig.getScope()).replace("REDIRECT_URI", redirecturi);
   // 重定向到授權(quán)頁面
   response.sendRedirect(requestUrl);
    } else if (userAgent != null && userAgent.contains("MicroMessenger")) {
      logger.info("來自微信");
   String redirecturi = HttpUtil.urlEnCode(commonConfig.getDomain() + wechatPay + ReqInfo);
     logger.info("REDIRECT_URI="+redirecturi);
     SysPayChannel channel = payChannelService.selectByChannelType(PayTypeConstant.Wechat);
  WXPublicConfig publicConfig = new WXPublicConfig();
  publicConfig.setAppId(channel.getAppid());
  publicConfig.setOriginId(channel.getOriginid());
  publicConfig.setAppSecret(channel.getAppsecret());
  publicConfig.setEncodingAESKey(channel.getEncodingaeskey());
   // 授權(quán)頁面地址
   String requestUrl = publicConfig.getAuthorizeinterface();
   requestUrl = requestUrl.replace("APPID", publicConfig.getAppId()).replace("REDIRECT_URI", redirecturi).replace("SCOPE", publicConfig.getScope()).replace("STATE", publicConfig.getState());
   // 重定向到授權(quán)頁面
   response.sendRedirect(requestUrl);
    } else {
      logger.info("未知來源");
    }
 logger.info("####################請求結(jié)束####################");
 }
 
 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 doGet(request, response);
 }
}

WechatPayServlet 在獲取到Redis中預(yù)訂單數(shù)據(jù)后,創(chuàng)建真實訂單并調(diào)用微信“統(tǒng)一下單接口”;

package com.platform.cloudlottery.servlet;
 
import com.alibaba.fastjson.JSONObject;
import com.github.wxpay.sdk.WXPayUtil;
import com.platform.cloudlottery.common.CommonConfig;
import com.platform.cloudlottery.common.jedis.JedisUtil;
import com.platform.cloudlottery.common.lang.StringUtils;
import com.platform.cloudlottery.common.utils.BusinessCodeUtils;
import com.platform.cloudlottery.common.wechat.bean.WeiXinOAuth3Token;
import com.platform.cloudlottery.common.wechat.bean.WeiXinUserInfo;
import com.platform.cloudlottery.common.wechat.config.WXPayConfig;
import com.platform.cloudlottery.common.wechat.config.WXPublicConfig;
import com.platform.cloudlottery.common.wechat.util.WeiXinOAuth3Util;
import com.platform.cloudlottery.common.wechat.util.WeiXinPayUtils;
import com.platform.cloudlottery.model.SysPayChannel;
import com.platform.cloudlottery.service.Impl.LotteryOrderServiceImpl;
import com.platform.cloudlottery.service.Impl.SysPayChannelServiceImpl;
import com.platform.cloudlottery.service.Impl.UserMemberServiceImpl;
import com.platform.cloudlottery.service.OrderServcie;
import com.platform.cloudlottery.service.UserInfoService;
import com.platform.cloudlottery.web.ResultContant;
import com.platform.cloudlottery.web.StatusContant.PayTypeConstant;
import com.platform.cloudlottery.web.SysKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
import redis.clients.jedis.Jedis;
 
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
 
/**
* @ClassName: WechatPayServlet
* @Description: TODO(這里用一句話描述這個類的作用)
* @author chenkun
* @date 2019年1月5日
*
 */
public class WechatPayServlet extends HttpServlet {
 private static final long serialVersionUID = -8457626626670970403L;
 protected Logger logger = LoggerFactory.getLogger(getClass());
 
 private static Jedis redis = JedisUtil.getJedis();
 
 @Value("${config.domain}")
 private String domain;
 
 @Value("${config.isProduction}")
 private boolean isProduction;
 
 // 請求路徑包含的字符串
 private static final String UrlStr = "wechatPay/";
 
 @Autowired
  private SysPayChannelServiceImpl payChannelService;
 
 @Autowired
 private UserMemberServiceImpl memberService;
 
 @Autowired
  private LotteryOrderServiceImpl lotteryOrderService;
 
 public void init(ServletConfig servletConfig) throws ServletException {
 super.init(servletConfig);
 SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, servletConfig.getServletContext());
 }
 
 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 logger.debug("####################請求開始####################");
 request.setCharacterEncoding("utf-8");
 response.setCharacterEncoding("utf-8");
 try {
  // 用戶同意授權(quán)后,能獲取到code
  String code = request.getParameter("code");
  // 用戶同意授權(quán)
  if (!"authdeny".equals(code)) {
  CommonConfig commonConfig = new CommonConfig();
  String RequestURL = request.getRequestURL().toString();
  logger.debug("URL : " + RequestURL);
  String QRCodeUrl = RequestURL.substring(RequestURL.indexOf(UrlStr) + UrlStr.length());
  String QRCodeReqInfo = QRCodeUrl.split("&")[0];
  String operatorId = QRCodeUrl.split("&")[1];
  logger.debug("QRCodeReqInfo : " + QRCodeReqInfo +";operatorId : " + operatorId);
  String advancekey = commonConfig.getLotteryorder() + QRCodeReqInfo;
 
  SysPayChannel channel = payChannelService.selectByChannelType(PayTypeConstant.Wechat);
  WXPublicConfig publicConfig = new WXPublicConfig();
  publicConfig.setAppId(channel.getAppid());
  publicConfig.setOriginId(channel.getOriginid());
  publicConfig.setAppSecret(channel.getAppsecret());
  publicConfig.setEncodingAESKey(channel.getEncodingaeskey());
  WXPayConfig payConfig = new WXPayConfig();
    payConfig.setMchId(channel.getMchid());
    payConfig.setAppId(channel.getAppid());
    payConfig.setKey(channel.getWxkey());
    payConfig.setApicertPath(channel.getPayCertUrl());
    payConfig.setSpbillCreateIp(channel.getSpbillcreateip());
  // 獲取網(wǎng)頁授權(quán)access_token
  WeiXinOAuth3Token weixinOauth3Token = WeiXinOAuth3Util.getOAuth3AccessToken(publicConfig,code);
  // 網(wǎng)頁授權(quán)接口訪問憑證
  String accessToken = weixinOauth3Token.getAccessToken();
  logger.debug("accessToken=" + accessToken);
  // 用戶標識
       String openId = weixinOauth3Token.getOpenId();
       logger.debug("openId="+openId);
       // 獲取用戶信息
       WeiXinUserInfo userInfo = WeiXinOAuth3Util.getOAuth3UserInfo(publicConfig, accessToken, openId);
       logger.debug(userInfo.getNickName()+"=====微信支付====="+userInfo.getOpenId());
       //添加或更新用戶信息
       String userid = UserInfoService.CreateUserMember(userInfo,memberService);
 
  if (!redis.exists(advancekey)) {// 判斷key是否存在
   logger.debug("二維碼失效");
   request.setAttribute("code", ResultContant.notuserdqrcode);
   request.setAttribute("message", "二維碼失效");
   request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response);
   logger.debug("####################請求結(jié)束####################");
   return;
  }
 
  if (StringUtils.trimToEmpty(redis.get(advancekey)).equals("")) {
   logger.debug("二維碼失效");
   request.setAttribute("code", ResultContant.notuserdqrcode);
   request.setAttribute("message", "二維碼失效");
   request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response);
   logger.debug("####################請求結(jié)束####################");
   return;
  }
 
  JSONObject jsonObject = JSONObject.parseObject(redis.get(advancekey));
  if (null == jsonObject) {
   logger.debug("二維碼失效");
   request.setAttribute("code", ResultContant.notuserdqrcode);
   request.setAttribute("message", "二維碼失效");
   request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response);
   logger.debug("####################請求結(jié)束####################");
   return;
  }
 
  if (redis.get(advancekey + "_lock") != null && !redis.get(advancekey + "_lock").equals("")){
   logger.debug("二維碼失效");
   request.setAttribute("code", ResultContant.notuserdqrcode);
   request.setAttribute("message", "二維碼失效");
   request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response);
   logger.debug("####################請求結(jié)束####################");
   return;
  }
 
  redis.setex(advancekey + "_lock", 1, "lock");
 
  String orderid = BusinessCodeUtils.getOrderNo(jsonObject.getString(SysKey.deviceSn));
  int money = jsonObject.getIntValue(SysKey.money);
  int lotterytype = jsonObject.getIntValue(SysKey.lotteryType);
  if (!orderid.equals("") && money!=0) {
   //創(chuàng)建訂單
   boolean bool = OrderServcie.createorder(QRCodeReqInfo, PayTypeConstant.Wechat, payConfig.getAppID(), userid, openId, orderid, jsonObject, lotteryOrderService);
   if (bool) {
   //刪除預(yù)訂單信息
   redis.del(advancekey);//一個預(yù)訂單只能創(chuàng)建一個訂單
   String paymoney = String.valueOf(money);
   if (!isProduction) {//測試環(huán)境
    paymoney = BigDecimal.valueOf(Long.valueOf(paymoney)).divide(new BigDecimal(100)).toString();//真實金額除100
   }
   logger.debug("是否生產(chǎn)環(huán)境:"+isProduction+";訂單金額為:"+String.valueOf(money)+";實際支付金額為:"+paymoney);
   //創(chuàng)建微信訂單
   Map<String, String> map = WeiXinPayUtils.createOrderJsapi(domain, payConfig, orderid, paymoney, lotterytype==0?"即開票":"電腦票", openId);
   logger.debug("創(chuàng)建微信支付預(yù)訂單返回數(shù)據(jù):"+JSONObject.toJSONString(map));
   if (map != null) {
    if (map.get("return_code").equals("SUCCESS")) {
    if (map.get("result_code").equals("SUCCESS")) {
     logger.debug("創(chuàng)建微信支付預(yù)訂單成功");
     Map<String, String> data = new LinkedHashMap<String, String>();
     data.put("appId", payConfig.getAppID());
     data.put("timeStamp", String.valueOf(new Date().getTime()/1000));
     data.put("nonceStr", WXPayUtil.generateNonceStr());
     data.put("package", "prepay_id="+map.get("prepay_id"));
     data.put("signType", "MD5");
     data.put("paySign", WXPayUtil.generateSignature(data, payConfig.getKey()));
     logger.debug("返回到客戶端的數(shù)據(jù):"+JSONObject.toJSONString(data));
     request.setAttribute("appId", data.get("appId"));
     request.setAttribute("timeStamp", data.get("timeStamp"));
     request.setAttribute("nonceStr", data.get("nonceStr"));
     request.setAttribute("package", data.get("package"));
     request.setAttribute("signType", data.get("signType"));
     request.setAttribute("paySign", data.get("paySign"));
 
     request.setAttribute("code", ResultContant.sucess);
     request.setAttribute("message", "成功");
     request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response);
    }else{
     logger.debug("創(chuàng)建訂單失?。?創(chuàng)建支付預(yù)訂單失敗");
     request.setAttribute("code", ResultContant.createordererror);
     request.setAttribute("message", "創(chuàng)建訂單失敗");
     request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response);
    }
    } else {
    logger.debug("創(chuàng)建訂單失?。簞?chuàng)建支付預(yù)訂單失敗");
    request.setAttribute("code", ResultContant.createordererror);
    request.setAttribute("message", "創(chuàng)建訂單失敗");
    request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response);
    }
   } else {
    logger.debug("創(chuàng)建訂單失?。簞?chuàng)建支付預(yù)訂單失敗");
    request.setAttribute("code", ResultContant.createordererror);
    request.setAttribute("message", "創(chuàng)建訂單失敗");
    request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response);
   }
   } else {
   logger.debug("創(chuàng)建訂單失?。簞?chuàng)建支付預(yù)訂單失敗");
   request.setAttribute("code", ResultContant.createordererror);
   request.setAttribute("message", "創(chuàng)建訂單失敗");
   request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response);
   }
  } else {
   logger.debug("創(chuàng)建訂單失敗;訂單金額或者訂單號數(shù)據(jù)有誤");
   request.setAttribute("code", ResultContant.createordererror);
   request.setAttribute("message", "創(chuàng)建訂單失敗");
   request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response);
  }
  }
 } catch (Exception e) {
  e.printStackTrace();
  logger.debug("系統(tǒng)異常");
  request.setAttribute("code", ResultContant.notuserdqrcode);
  request.setAttribute("message", "二維碼失效");
     request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response);
 }
 logger.debug("####################請求結(jié)束####################");
 }
 
 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 doGet(request, response);
 }
}

AliPayServlet  在獲取到Redis中預(yù)訂單數(shù)據(jù)后,創(chuàng)建真實訂單并調(diào)用支付寶“手機網(wǎng)站支付接口”;

package com.platform.cloudlottery.servlet;
 
import com.alibaba.fastjson.JSONObject;
import com.platform.cloudlottery.common.CommonConfig;
import com.platform.cloudlottery.common.alipay.bean.AliPayOAuth3Token;
import com.platform.cloudlottery.common.alipay.bean.AliPayUserInfo;
import com.platform.cloudlottery.common.alipay.config.MyAliPayConfig;
import com.platform.cloudlottery.common.alipay.uitl.AliPayOAuth3Util;
import com.platform.cloudlottery.common.alipay.uitl.AlipayPayUtils;
import com.platform.cloudlottery.common.jedis.JedisUtil;
import com.platform.cloudlottery.common.lang.StringUtils;
import com.platform.cloudlottery.common.properties.PropertiesUtils;
import com.platform.cloudlottery.common.utils.BusinessCodeUtils;
import com.platform.cloudlottery.model.SysPayChannel;
import com.platform.cloudlottery.service.Impl.LotteryOrderServiceImpl;
import com.platform.cloudlottery.service.Impl.SysPayChannelServiceImpl;
import com.platform.cloudlottery.service.Impl.UserMemberServiceImpl;
import com.platform.cloudlottery.service.OrderServcie;
import com.platform.cloudlottery.service.UserInfoService;
import com.platform.cloudlottery.web.ResultContant;
import com.platform.cloudlottery.web.StatusContant.PayTypeConstant;
import com.platform.cloudlottery.web.SysKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
import redis.clients.jedis.Jedis;
 
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Properties;
 
/**
* @ClassName: AliPayServlet
* @Description: TODO(這里用一句話描述這個類的作用)
* @author chenkun
* @date 2019年1月5日
*
 */
public class AliPayServlet extends HttpServlet {
 private static final long serialVersionUID = -8457626626670970403L;
 protected Logger logger = LoggerFactory.getLogger(getClass());
 
 private static Jedis redis = JedisUtil.getJedis();
 
 @Value("${config.domain}")
 private String domain;
 
 @Value("${config.isProduction}")
 private boolean isProduction;
 
 // 請求路徑包含的字符串
 private static final String UrlStr = "aliPay/";
 
 @Autowired
  private SysPayChannelServiceImpl payChannelService;
 
 @Autowired
 private UserMemberServiceImpl memberService;
 
 @Autowired
  private LotteryOrderServiceImpl lotteryOrderService;
 
 public void init(ServletConfig servletConfig) throws ServletException {
 super.init(servletConfig);
 SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, servletConfig.getServletContext());
 }
 
 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 logger.debug("####################請求開始####################");
 request.setCharacterEncoding("utf-8");
 response.setCharacterEncoding("utf-8");
 try {
  //用戶同意授權(quán)后,能獲取到code
  String code = request.getParameter("auth_code");
  //用戶同意授權(quán)
  if (!code.equals("")) {
  CommonConfig commonConfig = new CommonConfig();
  //具體業(yè)務(wù)
  String RequestURL = request.getRequestURL().toString();
  logger.debug("URL : " + RequestURL);
  String QRCodeUrl = RequestURL.substring(RequestURL.indexOf(UrlStr) + UrlStr.length());
  String QRCodeReqInfo = QRCodeUrl.split("&")[0];
  String operatorId = QRCodeUrl.split("&")[1];
  logger.debug("QRCodeReqInfo : " + QRCodeReqInfo +";operatorId : " + operatorId);
  String advancekey = commonConfig.getLotteryorder() + QRCodeReqInfo;
 
  SysPayChannel channel = payChannelService.selectByChannelType(PayTypeConstant.Alipay);
       MyAliPayConfig aliPayConfig = new MyAliPayConfig();
       aliPayConfig.setAppId(channel.getAppid());
       String certsrc = channel.getPayCertUrl();
       Properties propertiesFile = PropertiesUtils.getPropertiesFile(certsrc);
       if (propertiesFile != null) {
       aliPayConfig.setPayeeAccount(propertiesFile.getProperty("ALI_PAYEE_ACCOUNT"));
       aliPayConfig.setAppId(propertiesFile.getProperty("ALI_APP_ID"));
       aliPayConfig.setAliPayPublicKey(propertiesFile.getProperty("ALI_ALIPAY_PUBLIC_KEY"));
       aliPayConfig.setAppPayPublicKey(propertiesFile.getProperty("ALI_APP_PAY_PUBLIC_KEY"));
       aliPayConfig.setAppPrivateKey(propertiesFile.getProperty("ALI_APP_PRIVATE_KEY"));
  }
  //獲取網(wǎng)頁授權(quán)access_token
  AliPayOAuth3Token aliPayOAuth3Token = AliPayOAuth3Util.getOAuth3AccessToken(aliPayConfig,code);
  //網(wǎng)頁授權(quán)接口訪問憑證
  String accessToken = aliPayOAuth3Token.getAccessToken();
  logger.debug("accessToken=" + accessToken);
  //用戶標識
  String aliuserid = aliPayOAuth3Token.getUserid();
  logger.debug("aliuserid="+aliuserid);
  //獲取用戶信息
  AliPayUserInfo userInfo = AliPayOAuth3Util.getOAuth3UserInfo(aliPayConfig,accessToken,aliuserid);
  logger.debug(userInfo.getNickName()+"=====支付寶支付====="+userInfo.getUserId());
  //添加或更新用戶信息
       String userid = UserInfoService.CreateUserMember(userInfo,memberService);
 
  if (!redis.exists(advancekey)) {// 判斷key是否存在
   logger.debug("二維碼失效");
   request.setAttribute("code", ResultContant.notuserdqrcode);
   request.setAttribute("message", "二維碼失效");
   request.getRequestDispatcher("../alipay/AliPay.jsp").forward(request, response);
   logger.debug("####################請求結(jié)束####################");
   return;
  }
 
  if (StringUtils.trimToEmpty(redis.get(advancekey)).equals("")) {
   logger.debug("二維碼失效");
   request.setAttribute("code", ResultContant.notuserdqrcode);
   request.setAttribute("message", "二維碼失效");
   request.getRequestDispatcher("../alipay/AliPay.jsp").forward(request, response);
   logger.debug("####################請求結(jié)束####################");
   return;
  }
 
  JSONObject jsonObject = JSONObject.parseObject(redis.get(advancekey));
  if (null == jsonObject) {
   logger.debug("二維碼失效");
   request.setAttribute("code", ResultContant.notuserdqrcode);
   request.setAttribute("message", "二維碼失效");
   request.getRequestDispatcher("../alipay/AliPay.jsp").forward(request, response);
   logger.debug("####################請求結(jié)束####################");
   return;
  }
 
  if (redis.get(advancekey + "_lock") != null && !redis.get(advancekey + "_lock").equals("")){
   logger.debug("二維碼失效");
   request.setAttribute("code", ResultContant.notuserdqrcode);
   request.setAttribute("message", "二維碼失效");
   request.getRequestDispatcher("../alipay/AliPay.jsp").forward(request, response);
   logger.debug("####################請求結(jié)束####################");
   return;
  }
 
  redis.setex(advancekey + "_lock", 1, "lock");
 
  String orderid = BusinessCodeUtils.getOrderNo(jsonObject.getString(SysKey.deviceSn));
  int money = jsonObject.getIntValue(SysKey.money);
  int lotterytype = jsonObject.getIntValue(SysKey.lotteryType);
  if (!orderid.equals("") && money != 0) {
   //創(chuàng)建訂單
   boolean bool = OrderServcie.createorder(QRCodeReqInfo, PayTypeConstant.Alipay, aliPayConfig.getAppId(), userid, aliuserid, orderid, jsonObject, lotteryOrderService);
   if (bool) {
   //刪除預(yù)訂單信息
   redis.del(advancekey);//一個預(yù)訂單只能創(chuàng)建一個訂單
   String paymoney = BigDecimal.valueOf(Long.valueOf(money)).divide(new BigDecimal(100)).toString();
   if (!isProduction) {//測試環(huán)境
    paymoney = BigDecimal.valueOf(Long.valueOf(paymoney)).divide(new BigDecimal(100)).toString();//真實金額除100
   }
   logger.debug("是否生產(chǎn)環(huán)境:"+isProduction+";訂單金額為:"+BigDecimal.valueOf(Long.valueOf(money)).divide(new BigDecimal(100)).toString()+";實際支付金額為:"+paymoney);
   //創(chuàng)建支付寶訂單
   String responsestr = AlipayPayUtils.createOrderWapPay(domain, aliPayConfig, orderid, lotterytype==0?"即開票":"電腦票", paymoney, "");
   logger.debug("創(chuàng)建支付寶支付預(yù)訂單返回數(shù)據(jù):"+responsestr);
   if (!responsestr.equals("")) {
    response.setContentType("text/html;charset=UTF-8");
    response.getWriter().write(responsestr);//直接將完整的表單html輸出到頁面
    response.getWriter().flush();
    response.getWriter().close();
    response.getWriter().append("Served at: ").append(request.getContextPath());
   } else {
    logger.debug("創(chuàng)建訂單失?。簞?chuàng)建支付預(yù)訂單失敗");
    request.setAttribute("code", ResultContant.createordererror);
    request.setAttribute("message", "創(chuàng)建訂單失敗");
    request.getRequestDispatcher("../alipay/AliPay.jsp").forward(request, response);
   }
   } else {
   logger.debug("創(chuàng)建訂單失?。簞?chuàng)建支付預(yù)訂單失敗");
   request.setAttribute("code", ResultContant.createordererror);
   request.setAttribute("message", "創(chuàng)建訂單失敗");
   request.getRequestDispatcher("../alipay/AliPay.jsp").forward(request, response);
   }
  } else {
   logger.debug("創(chuàng)建訂單失敗;訂單金額或者訂單號數(shù)據(jù)有誤");
   request.setAttribute("code", ResultContant.createordererror);
   request.setAttribute("message", "創(chuàng)建訂單失敗");
   request.getRequestDispatcher("../alipay/AliPay.jsp").forward(request, response);
  }
  }
 } catch (Exception e) {
  e.printStackTrace();
  logger.debug("系統(tǒng)異常");
  request.setAttribute("code", "二維碼失效");
  request.setAttribute("message", "二維碼失效");
     request.getRequestDispatcher("../alipay/AliPay.jsp").forward(request, response);
 }
 logger.debug("####################請求結(jié)束####################");
 }
 
 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 doGet(request, response);
 }
}

三、創(chuàng)建微信支付結(jié)果回調(diào)接口和支付寶支付接口回調(diào)接口,用于接收微信或者支付寶的支付結(jié)果通知;

aliPayNotify  支付寶支付成功回調(diào)接口

/**
 * @Title: aliPayNotify
 * @Description: TODO(支付寶支付成功過回調(diào))
 * @author chenkun
 * @return 參數(shù)
 * @return String 返回類型
 * @throws
 */
 @RequestMapping(value = "/aliPayNotify", method = RequestMethod.POST)
 public String aliPayNotify() {
 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
 HttpServletRequest request = attributes.getRequest();
 Map<String, String> params = convertRequestParamsToMap(request); // 將異步通知中收到的待驗證所有參數(shù)都存放到map中
 String paramsJson = JSON.toJSONString(params);
 logger.info("支付寶支付回調(diào),{" + paramsJson + "}");
 try {
  SysPayChannel channel = payChannelService.selectByChannelType(PayTypeConstant.Alipay);
      MyAliPayConfig aliPayConfig = new MyAliPayConfig();
      aliPayConfig.setAppId(channel.getAppid());
      String certsrc = channel.getPayCertUrl();
      Properties propertiesFile = PropertiesUtils.getPropertiesFile(certsrc);
      if (propertiesFile != null) {
       aliPayConfig.setPayeeAccount(propertiesFile.getProperty("ALI_PAYEE_ACCOUNT"));
       aliPayConfig.setAppId(propertiesFile.getProperty("ALI_APP_ID"));
       aliPayConfig.setAliPayPublicKey(propertiesFile.getProperty("ALI_ALIPAY_PUBLIC_KEY"));
       aliPayConfig.setAppPayPublicKey(propertiesFile.getProperty("ALI_APP_PAY_PUBLIC_KEY"));
       aliPayConfig.setAppPrivateKey(propertiesFile.getProperty("ALI_APP_PRIVATE_KEY"));
  }
  // 調(diào)用SDK驗證簽名
  boolean signVerified = AlipaySignature.rsaCheckV1(params, aliPayConfig.getAliPayPublicKey(),
   aliPayConfig.getCharset(), aliPayConfig.getSigntype());
  if (signVerified) {
  logger.info("支付寶回調(diào)簽名認證成功");
  // 按照支付結(jié)果異步通知中的描述,對支付結(jié)果中的業(yè)務(wù)內(nèi)容進行1\2\3\4二次校驗,校驗成功后在response中返回success,校驗失敗返回failure
  this.check(params);
  // 另起線程處理業(yè)務(wù)
  executorService.execute(new AliPayNotifyTask(params,payCallBackService));
  // 如果簽名驗證正確,立即返回success,后續(xù)業(yè)務(wù)另起線程單獨處理
  // 業(yè)務(wù)處理失敗,可查看日志進行補償,跟支付寶已經(jīng)沒多大關(guān)系。
  return "success";
  } else {
  logger.info("支付寶回調(diào)簽名認證失敗,signVerified=false, paramsJson:{}", paramsJson);
  return "failure";
  }
 } catch (AlipayApiException e) {
  logger.error("支付寶回調(diào)簽名認證失敗,paramsJson:{},errorMsg:{}", paramsJson, e.getMessage());
  return "failure";
 }
 }

WechatPayNotify  微信支付成功回調(diào)

/**
 * @Title: WechatPayNotify
 * @Description: TODO(微信支付成功回調(diào))
 * @author chenkun
 * @return 參數(shù)
 * @return String 返回類型
 * @throws
 */
 @RequestMapping(value = "/WechatPayNotify", method = RequestMethod.POST)
 public String WechatPayNotify() {
 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
 HttpServletRequest request = attributes.getRequest();
 String result = "";// 返回給微信的處理結(jié)果
 String notityXml = "";// 微信給返回的東西 
 String inputLine;
 try {
  while ((inputLine = request.getReader().readLine()) != null) {
  notityXml += inputLine;
  }
  request.getReader().close();
 } catch (Exception e) {
  logger.error("微信支付回調(diào)失敗,paramsJson:{},errorMsg:{}", "回調(diào)數(shù)據(jù)獲取失敗", e.getMessage());
  result = setXml("fail", "xml獲取失敗");
  e.printStackTrace();
 }
 if (StringUtils.isEmpty(notityXml)) {
  logger.info("微信支付回調(diào)失敗:回調(diào)數(shù)據(jù)為空");
  result = setXml("fail", "xml為空");
 }
 try {
  logger.info("微信支付回調(diào)數(shù)據(jù):{" + notityXml + "}");
  Map<String, String> map = WXPayUtil.xmlToMap(notityXml);
  String result_code = (String) map.get("result_code");// 業(yè)務(wù)結(jié)果 
  String return_code = (String) map.get("return_code");// SUCCESS/FAIL 
  // 解析各種數(shù)據(jù) 
  if (result_code.equals("SUCCESS")) {
  result = setXml("SUCCESS", "OK");
  } else {
  logger.info("微信返回的交易狀態(tài)不正確(result_code=" + result_code + ")");
  result = setXml("fail", "微信返回的交易狀態(tài)不正確(result_code=" + result_code + ")");
  }
  // 如果微信返回的結(jié)果是success,則修改訂單狀態(tài) 
  if (return_code.equals("SUCCESS")) {
 
  // 這里是我的業(yè)務(wù)........................................
  String sr = payCallBackService.confirmWechatPayOrder(map,true);
  logger.debug(sr);
  if (StringUtils.isNotEmpty(sr)){
   result = setXml("fail",sr);
   executorService.execute(new WechatPayRefundTask(map,payCallBackService));
  } else {
   result = setXml("SUCCESS", "OK");
  }
  } else {
  result = setXml("fail", return_code);
  }
 } catch (Exception e) {
  logger.error("微信支付回調(diào)失敗,paramsJson:{},errorMsg:{}", "回調(diào)數(shù)據(jù)處理失敗", e.getMessage());
  result = setXml("fail", "回調(diào)數(shù)據(jù)處理失敗");
  e.printStackTrace();
 }
 logger.info("回調(diào)成功----返回給微信的xml:" + result);
 return result;
 }

僅此供給大家,在大家有這方面的需求時,少走彎路!

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI