一、支付二维码(预订单)

根据需要购买的信息创建预订单,将订单信息保存到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

微信、支付宝二码合一扫码支付实现思路相关推荐

  1. 微信支付宝二码合一开发(java)

    微信支付宝二码合一开发(java) 1.通过请求的User-Agent来区分是微信还是支付宝 (HttpServletRequest request) request.getHeader(" ...

  2. 支付宝当面付之扫码支付“无效签名”

    做支付宝的当面付扫码支付的时候,遇到最纠结的问题就是一直提示"无效签名",然而官方又没有给出很明确的说明,在网上搜索了很长时间,也没有找到解决的具体例子,我就把我的经历说一下,有需 ...

  3. 微信支付宝二维码图片批量改名工具

    微信支付宝二维码图片批量改名工具 以上是微信支付宝保存的二维码图片名称. 以上已经改成了以金额命名的文件. 某种情况下,例如我在做https://www.cmd5.com的支付系统的时候,需要处理大量 ...

  4. 一种实现个人微信支付宝二维码收款接口的方法

    一种实现个人微信支付宝二维码收款接口的方法 只有企业资质才能申请微信支付宝接口,要想实现自动收款除了想办法搞到企业资质申请官方的微信支付接口外,还可以想办法通过个人收款码来实现. 1.上传个人微信支付 ...

  5. 企业微信三方开发(五):扫码登录

    其他链接 初识微信开发 企业微信三方开发:注册企业微信服务商 企业微信三方开发(一):回调验证及重要参数获取 企业微信三方开发(二):获取access_token 企业微信三方开发(三):网页授权登录 ...

  6. PHP 实现微信关注公众号或扫码实现获取用户信息

    php微信关注公众号或扫码实现获取用户信息(内含简易框架搭建,可复用) 概述 用户可通过扫描二维码进行关注或单纯进行扫码操作,实现获取用户微信信息,提高公众号关注率 详细 流程 准备工作 准备公众号及 ...

  7. 如何把视频转换生成二维码,扫码直接播放?

    如何把自己的视频生成二维码,扫一扫二维码,就能直接观看视频?还有,最好不要有任何广告? 能实现吗?能!用酷播云视频二维码,一键搞定! 官网地址:http://www.cuplayer.com/clou ...

  8. java实现生成二维码及扫码登录

    java实现生成二维码及扫码登录 1. 场景描述 2. 实现思路 3. 代码实现过程 3.1 pom.xml 3.2 二维码工具类 3.3 生成二维码并下载为图片 3.4 扫码登录 1. 场景描述   ...

  9. 微信小程序调起扫码功能

    场景:在微信小程序中使用扫码功能,对扫描的物品进行识别处理 1.先随便定义一个点击调起扫码的元素 <view bindtap="tapScan">扫码</view ...

最新文章

  1. Jpcap过滤GTunnel程序数据包
  2. mysql json 函数_MYSQL 开发设计表是硬邦邦的VARHCAR 还是JSON TYPE 来处理数据更香
  3. [WinError 17] 系统无法将文件移到不同的磁盘驱动器
  4. 如何正确地使用Java的@deprecated标注
  5. javascript中的字符串编码、字符串方法详解
  6. 接计算机专业怎样备考,专接本考试计算机专业复习指南.pdf
  7. 为什么那么多公司不用 .NET,而选择PHP、JSP,是 .NET有什么缺点吗?
  8. java解析excelpoi_Java解析Excel之POI(一)
  9. 在苹果Mac中巧用聚焦搜索Spotlight
  10. 数字图像处理—图像纹理特征
  11. YOUTUBE API调用 JAVA
  12. 阿里云商标注册怎么样?附上申请步骤流程
  13. 干货分享|Contrast essay写作步骤分析
  14. 一流程序员靠数学,二流程序员靠算法,低端看高端就是黑魔法!网友:我是七流靠复制
  15. c# encode decode
  16. 网站友情链接交换的方法
  17. 内存类型UDIMM、RDIMM、LRDIMM
  18. matlab给程序加总标题,【转】matlab标题,给figure加标题,subplot的部分用法
  19. 数据安全--15--去标识化技术
  20. 通信原理包络是什么意思_什么是PFC稳压开关电源?

热门文章

  1. minecraft_使用MCDungeon将地牢,废墟和寻宝游戏添加到您的Minecraft世界中
  2. C#面向对象总结小项目之实现英雄联盟回合制小游戏(文字版)
  3. 问题:解决Android中socket自动断开连接
  4. SpringBoot:整合Redis(概述,数据类型,持久化,RedisTemplate)
  5. 下载/拷贝下来的压缩包打开内容为空解决方案
  6. 带有响应式网页设计的MEAN和UGLI CRUD
  7. 首次公开!2020年中国程序员薪资调查报告,近一半程序员单身、年薪低于 15 万,别被脉脉和知乎带偏了!...
  8. 遨博Aubo-i10机器人正逆运动学公式推导及其C++编程实现
  9. Java 装箱与拆箱小结
  10. 监听电话状态并自动接听来电