您好,登錄后才能下訂單哦!
一、支付二維碼(預訂單)
根據需要購買的信息創建預訂單,將訂單信息保存到Redis中,并設置有效期,注意生產二維碼的鏈接后的參數可以關聯到Redis中的key;
QRCode 為servlet掃碼請求的URL;
UUIDUtils.getUUID() 為預訂單單號,在servlet請求中截取,然后在Redis中查找對應的Key的數據;
二維碼地址:http://kung900519.qicp.io/interface/QRCode/UUIDUtils.getUUID();
二、創建二維碼掃碼請求地址servlet:QRCodeServlet;微信支付重定向請求servlet:WechatPayServlet;支付寶重定向請求servlet:AliPayServlet;
QRCodeServlet 用于用戶使用微信或者支付寶掃碼二維碼進行客戶端識別及重定向到對應的業務處理;
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(根據請求的后綴獲取該數據編碼對應的數據,并重定向到頁面) * @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()); // 授權頁面地址 String requestUrl = aliPayConfig.getAuthgateway(); requestUrl = requestUrl.replace("APPID", aliPayConfig.getAppId()).replace("SCOPE", aliPayConfig.getScope()).replace("REDIRECT_URI", redirecturi); // 重定向到授權頁面 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()); // 授權頁面地址 String requestUrl = publicConfig.getAuthorizeinterface(); requestUrl = requestUrl.replace("APPID", publicConfig.getAppId()).replace("REDIRECT_URI", redirecturi).replace("SCOPE", publicConfig.getScope()).replace("STATE", publicConfig.getState()); // 重定向到授權頁面 response.sendRedirect(requestUrl); } else { logger.info("未知來源"); } logger.info("####################請求結束####################"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
WechatPayServlet 在獲取到Redis中預訂單數據后,創建真實訂單并調用微信“統一下單接口”;
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 { // 用戶同意授權后,能獲取到code String code = request.getParameter("code"); // 用戶同意授權 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()); // 獲取網頁授權access_token WeiXinOAuth3Token weixinOauth3Token = WeiXinOAuth3Util.getOAuth3AccessToken(publicConfig,code); // 網頁授權接口訪問憑證 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("####################請求結束####################"); 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("####################請求結束####################"); 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("####################請求結束####################"); 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("####################請求結束####################"); 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) { //創建訂單 boolean bool = OrderServcie.createorder(QRCodeReqInfo, PayTypeConstant.Wechat, payConfig.getAppID(), userid, openId, orderid, jsonObject, lotteryOrderService); if (bool) { //刪除預訂單信息 redis.del(advancekey);//一個預訂單只能創建一個訂單 String paymoney = String.valueOf(money); if (!isProduction) {//測試環境 paymoney = BigDecimal.valueOf(Long.valueOf(paymoney)).divide(new BigDecimal(100)).toString();//真實金額除100 } logger.debug("是否生產環境:"+isProduction+";訂單金額為:"+String.valueOf(money)+";實際支付金額為:"+paymoney); //創建微信訂單 Map<String, String> map = WeiXinPayUtils.createOrderJsapi(domain, payConfig, orderid, paymoney, lotterytype==0?"即開票":"電腦票", openId); logger.debug("創建微信支付預訂單返回數據:"+JSONObject.toJSONString(map)); if (map != null) { if (map.get("return_code").equals("SUCCESS")) { if (map.get("result_code").equals("SUCCESS")) { logger.debug("創建微信支付預訂單成功"); 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("返回到客戶端的數據:"+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("創建訂單失敗: 創建支付預訂單失敗"); request.setAttribute("code", ResultContant.createordererror); request.setAttribute("message", "創建訂單失敗"); request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response); } } else { logger.debug("創建訂單失敗:創建支付預訂單失敗"); request.setAttribute("code", ResultContant.createordererror); request.setAttribute("message", "創建訂單失敗"); request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response); } } else { logger.debug("創建訂單失敗:創建支付預訂單失敗"); request.setAttribute("code", ResultContant.createordererror); request.setAttribute("message", "創建訂單失敗"); request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response); } } else { logger.debug("創建訂單失敗:創建支付預訂單失敗"); request.setAttribute("code", ResultContant.createordererror); request.setAttribute("message", "創建訂單失敗"); request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response); } } else { logger.debug("創建訂單失敗;訂單金額或者訂單號數據有誤"); request.setAttribute("code", ResultContant.createordererror); request.setAttribute("message", "創建訂單失敗"); request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response); } } } catch (Exception e) { e.printStackTrace(); logger.debug("系統異常"); request.setAttribute("code", ResultContant.notuserdqrcode); request.setAttribute("message", "二維碼失效"); request.getRequestDispatcher("../wechat/WechatPay.jsp").forward(request, response); } logger.debug("####################請求結束####################"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
AliPayServlet 在獲取到Redis中預訂單數據后,創建真實訂單并調用支付寶“手機網站支付接口”;
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 { //用戶同意授權后,能獲取到code String code = request.getParameter("auth_code"); //用戶同意授權 if (!code.equals("")) { 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.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")); } //獲取網頁授權access_token AliPayOAuth3Token aliPayOAuth3Token = AliPayOAuth3Util.getOAuth3AccessToken(aliPayConfig,code); //網頁授權接口訪問憑證 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("####################請求結束####################"); 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("####################請求結束####################"); 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("####################請求結束####################"); 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("####################請求結束####################"); 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) { //創建訂單 boolean bool = OrderServcie.createorder(QRCodeReqInfo, PayTypeConstant.Alipay, aliPayConfig.getAppId(), userid, aliuserid, orderid, jsonObject, lotteryOrderService); if (bool) { //刪除預訂單信息 redis.del(advancekey);//一個預訂單只能創建一個訂單 String paymoney = BigDecimal.valueOf(Long.valueOf(money)).divide(new BigDecimal(100)).toString(); if (!isProduction) {//測試環境 paymoney = BigDecimal.valueOf(Long.valueOf(paymoney)).divide(new BigDecimal(100)).toString();//真實金額除100 } logger.debug("是否生產環境:"+isProduction+";訂單金額為:"+BigDecimal.valueOf(Long.valueOf(money)).divide(new BigDecimal(100)).toString()+";實際支付金額為:"+paymoney); //創建支付寶訂單 String responsestr = AlipayPayUtils.createOrderWapPay(domain, aliPayConfig, orderid, lotterytype==0?"即開票":"電腦票", paymoney, ""); logger.debug("創建支付寶支付預訂單返回數據:"+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("創建訂單失敗:創建支付預訂單失敗"); request.setAttribute("code", ResultContant.createordererror); request.setAttribute("message", "創建訂單失敗"); request.getRequestDispatcher("../alipay/AliPay.jsp").forward(request, response); } } else { logger.debug("創建訂單失敗:創建支付預訂單失敗"); request.setAttribute("code", ResultContant.createordererror); request.setAttribute("message", "創建訂單失敗"); request.getRequestDispatcher("../alipay/AliPay.jsp").forward(request, response); } } else { logger.debug("創建訂單失敗;訂單金額或者訂單號數據有誤"); request.setAttribute("code", ResultContant.createordererror); request.setAttribute("message", "創建訂單失敗"); request.getRequestDispatcher("../alipay/AliPay.jsp").forward(request, response); } } } catch (Exception e) { e.printStackTrace(); logger.debug("系統異常"); request.setAttribute("code", "二維碼失效"); request.setAttribute("message", "二維碼失效"); request.getRequestDispatcher("../alipay/AliPay.jsp").forward(request, response); } logger.debug("####################請求結束####################"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
三、創建微信支付結果回調接口和支付寶支付接口回調接口,用于接收微信或者支付寶的支付結果通知;
aliPayNotify 支付寶支付成功回調接口
/** * @Title: aliPayNotify * @Description: TODO(支付寶支付成功過回調) * @author chenkun * @return 參數 * @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); // 將異步通知中收到的待驗證所有參數都存放到map中 String paramsJson = JSON.toJSONString(params); logger.info("支付寶支付回調,{" + 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")); } // 調用SDK驗證簽名 boolean signVerified = AlipaySignature.rsaCheckV1(params, aliPayConfig.getAliPayPublicKey(), aliPayConfig.getCharset(), aliPayConfig.getSigntype()); if (signVerified) { logger.info("支付寶回調簽名認證成功"); // 按照支付結果異步通知中的描述,對支付結果中的業務內容進行1\2\3\4二次校驗,校驗成功后在response中返回success,校驗失敗返回failure this.check(params); // 另起線程處理業務 executorService.execute(new AliPayNotifyTask(params,payCallBackService)); // 如果簽名驗證正確,立即返回success,后續業務另起線程單獨處理 // 業務處理失敗,可查看日志進行補償,跟支付寶已經沒多大關系。 return "success"; } else { logger.info("支付寶回調簽名認證失敗,signVerified=false, paramsJson:{}", paramsJson); return "failure"; } } catch (AlipayApiException e) { logger.error("支付寶回調簽名認證失敗,paramsJson:{},errorMsg:{}", paramsJson, e.getMessage()); return "failure"; } }
WechatPayNotify 微信支付成功回調
/** * @Title: WechatPayNotify * @Description: TODO(微信支付成功回調) * @author chenkun * @return 參數 * @return String 返回類型 * @throws */ @RequestMapping(value = "/WechatPayNotify", method = RequestMethod.POST) public String WechatPayNotify() { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); String result = "";// 返回給微信的處理結果 String notityXml = "";// 微信給返回的東西 String inputLine; try { while ((inputLine = request.getReader().readLine()) != null) { notityXml += inputLine; } request.getReader().close(); } catch (Exception e) { logger.error("微信支付回調失敗,paramsJson:{},errorMsg:{}", "回調數據獲取失敗", e.getMessage()); result = setXml("fail", "xml獲取失敗"); e.printStackTrace(); } if (StringUtils.isEmpty(notityXml)) { logger.info("微信支付回調失敗:回調數據為空"); result = setXml("fail", "xml為空"); } try { logger.info("微信支付回調數據:{" + notityXml + "}"); Map<String, String> map = WXPayUtil.xmlToMap(notityXml); String result_code = (String) map.get("result_code");// 業務結果 String return_code = (String) map.get("return_code");// SUCCESS/FAIL // 解析各種數據 if (result_code.equals("SUCCESS")) { result = setXml("SUCCESS", "OK"); } else { logger.info("微信返回的交易狀態不正確(result_code=" + result_code + ")"); result = setXml("fail", "微信返回的交易狀態不正確(result_code=" + result_code + ")"); } // 如果微信返回的結果是success,則修改訂單狀態 if (return_code.equals("SUCCESS")) { // 這里是我的業務........................................ 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("微信支付回調失敗,paramsJson:{},errorMsg:{}", "回調數據處理失敗", e.getMessage()); result = setXml("fail", "回調數據處理失敗"); e.printStackTrace(); } logger.info("回調成功----返回給微信的xml:" + result); return result; }
僅此供給大家,在大家有這方面的需求時,少走彎路!
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。