微信、支付宝二码合一扫码支付实现思路

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

        根据需要购买的信息创建预订单,将订单信息保存到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.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
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kung900519

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值