微信、支付宝二码合一扫码支付实现思路
一、支付二維碼(預訂單)
? ? ? ? 根據需要購買的信息創建預訂單,將訂單信息保存到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/";@Autowiredprivate 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.WeiXinOAuth2Token; 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.WeiXinOAuth2Util; 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/";@Autowiredprivate SysPayChannelServiceImpl payChannelService;@Autowiredprivate UserMemberServiceImpl memberService;@Autowiredprivate 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 {// 用戶同意授權后,能獲取到codeString 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_tokenWeiXinOAuth2Token weixinOauth2Token = WeiXinOAuth2Util.getOAuth2AccessToken(publicConfig,code);// 網頁授權接口訪問憑證String accessToken = weixinOauth2Token.getAccessToken();logger.debug("accessToken=" + accessToken);// 用戶標識String openId = weixinOauth2Token.getOpenId();logger.debug("openId="+openId);// 獲取用戶信息WeiXinUserInfo userInfo = WeiXinOAuth2Util.getOAuth2UserInfo(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.AliPayOAuth2Token; import com.platform.cloudlottery.common.alipay.bean.AliPayUserInfo; import com.platform.cloudlottery.common.alipay.config.MyAliPayConfig; import com.platform.cloudlottery.common.alipay.uitl.AliPayOAuth2Util; 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/";@Autowiredprivate SysPayChannelServiceImpl payChannelService;@Autowiredprivate UserMemberServiceImpl memberService;@Autowiredprivate 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 {//用戶同意授權后,能獲取到codeString 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_tokenAliPayOAuth2Token aliPayOAuth2Token = AliPayOAuth2Util.getOAuth2AccessToken(aliPayConfig,code);//網頁授權接口訪問憑證String accessToken = aliPayOAuth2Token.getAccessToken();logger.debug("accessToken=" + accessToken);//用戶標識String aliuserid = aliPayOAuth2Token.getUserid();logger.debug("aliuserid="+aliuserid);//獲取用戶信息AliPayUserInfo userInfo = AliPayOAuth2Util.getOAuth2UserInfo(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,校驗失敗返回failurethis.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;}僅此供給大家,在大家有這方面的需求時,少走彎路!如果對大家有用,請大家多多點贊支持!
尊重原創,轉載請注明出處
kung900519
https://blog.csdn.net/kung_com/article/details/89468673
https://www.jianshu.com/p/b0282b43007b
總結
以上是生活随笔為你收集整理的微信、支付宝二码合一扫码支付实现思路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅谈易语言多线程 by逆风
- 下一篇: iShot——Mac必备截图工具