微信、支付宝二码合一扫码支付实现思路
一、支付二維碼(預(yù)訂單)
? ? ? ? 根據(jù)需要購(gòu)買的信息創(chuàng)建預(yù)訂單,將訂單信息保存到Redis中,并設(shè)置有效期,注意生產(chǎn)二維碼的鏈接后的參數(shù)可以關(guān)聯(lián)到Redis中的key;
? ? ? ?QRCode? 為servlet掃碼請(qǐng)求的URL;
? ? ? ?UUIDUtils.getUUID()? 為預(yù)訂單單號(hào),在servlet請(qǐng)求中截取,然后在Redis中查找對(duì)應(yīng)的Key的數(shù)據(jù);
? ? ? ? 二維碼地址:http://kung900519.qicp.io/interface/QRCode/UUIDUtils.getUUID();
二、創(chuàng)建二維碼掃碼請(qǐng)求地址servlet:QRCodeServlet;微信支付重定向請(qǐng)求servlet:WechatPayServlet;支付寶重定向請(qǐng)求servlet:AliPayServlet;
? ? QRCodeServlet? 用于用戶使用微信或者支付寶掃碼二維碼進(jìn)行客戶端識(shí)別及重定向到對(duì)應(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ù)請(qǐng)求的后綴獲取該數(shù)據(jù)編碼對(duì)應(yīng)的數(shù)據(jù),并重定向到頁(yè)面)* @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("####################請(qǐng)求開(kāi)始####################");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("來(lái)自支付寶");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)頁(yè)面地址String requestUrl = aliPayConfig.getAuthgateway();requestUrl = requestUrl.replace("APPID", aliPayConfig.getAppId()).replace("SCOPE", aliPayConfig.getScope()).replace("REDIRECT_URI", redirecturi);// 重定向到授權(quán)頁(yè)面response.sendRedirect(requestUrl);} else if (userAgent != null && userAgent.contains("MicroMessenger")) {logger.info("來(lái)自微信");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)頁(yè)面地址String requestUrl = publicConfig.getAuthorizeinterface();requestUrl = requestUrl.replace("APPID", publicConfig.getAppId()).replace("REDIRECT_URI", redirecturi).replace("SCOPE", publicConfig.getScope()).replace("STATE", publicConfig.getState());// 重定向到授權(quán)頁(yè)面response.sendRedirect(requestUrl);} else {logger.info("未知來(lái)源");}logger.info("####################請(qǐng)求結(jié)束####################");}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);} }? ?WechatPayServlet 在獲取到Redis中預(yù)訂單數(shù)據(jù)后,創(chuàng)建真實(shí)訂單并調(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.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(這里用一句話描述這個(gè)類的作用) * @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;// 請(qǐng)求路徑包含的字符串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("####################請(qǐng)求開(kāi)始####################");request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");try {// 用戶同意授權(quán)后,能獲取到codeString 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)頁(yè)授權(quán)access_tokenWeiXinOAuth2Token weixinOauth2Token = WeiXinOAuth2Util.getOAuth2AccessToken(publicConfig,code);// 網(wǎng)頁(yè)授權(quán)接口訪問(wèn)憑證String accessToken = weixinOauth2Token.getAccessToken();logger.debug("accessToken=" + accessToken);// 用戶標(biāo)識(shí)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("####################請(qǐng)求結(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("####################請(qǐng)求結(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("####################請(qǐng)求結(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("####################請(qǐng)求結(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);//一個(gè)預(yù)訂單只能創(chuàng)建一個(gè)訂單String paymoney = String.valueOf(money);if (!isProduction) {//測(cè)試環(huán)境paymoney = BigDecimal.valueOf(Long.valueOf(paymoney)).divide(new BigDecimal(100)).toString();//真實(shí)金額除100}logger.debug("是否生產(chǎn)環(huán)境:"+isProduction+";訂單金額為:"+String.valueOf(money)+";實(shí)際支付金額為:"+paymoney);//創(chuàng)建微信訂單Map<String, String> map = WeiXinPayUtils.createOrderJsapi(domain, payConfig, orderid, paymoney, lotterytype==0?"即開(kāi)票":"電腦票", openId);logger.debug("創(chuàng)建微信支付預(yù)訂單返回?cái)?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)建訂單失敗;訂單金額或者訂單號(hào)數(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("####################請(qǐng)求結(jié)束####################");}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);} }? ?AliPayServlet??在獲取到Redis中預(yù)訂單數(shù)據(jù)后,創(chuàng)建真實(shí)訂單并調(diào)用支付寶“手機(jī)網(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.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(這里用一句話描述這個(gè)類的作用) * @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;// 請(qǐng)求路徑包含的字符串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("####################請(qǐng)求開(kāi)始####################");request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");try {//用戶同意授權(quán)后,能獲取到codeString 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)頁(yè)授權(quán)access_tokenAliPayOAuth2Token aliPayOAuth2Token = AliPayOAuth2Util.getOAuth2AccessToken(aliPayConfig,code);//網(wǎng)頁(yè)授權(quán)接口訪問(wèn)憑證String accessToken = aliPayOAuth2Token.getAccessToken();logger.debug("accessToken=" + accessToken);//用戶標(biāo)識(shí)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("####################請(qǐng)求結(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("####################請(qǐng)求結(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("####################請(qǐng)求結(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("####################請(qǐng)求結(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);//一個(gè)預(yù)訂單只能創(chuàng)建一個(gè)訂單String paymoney = BigDecimal.valueOf(Long.valueOf(money)).divide(new BigDecimal(100)).toString();if (!isProduction) {//測(cè)試環(huán)境paymoney = BigDecimal.valueOf(Long.valueOf(paymoney)).divide(new BigDecimal(100)).toString();//真實(shí)金額除100}logger.debug("是否生產(chǎn)環(huán)境:"+isProduction+";訂單金額為:"+BigDecimal.valueOf(Long.valueOf(money)).divide(new BigDecimal(100)).toString()+";實(shí)際支付金額為:"+paymoney);//創(chuàng)建支付寶訂單String responsestr = AlipayPayUtils.createOrderWapPay(domain, aliPayConfig, orderid, lotterytype==0?"即開(kāi)票":"電腦票", paymoney, "");logger.debug("創(chuàng)建支付寶支付預(yù)訂單返回?cái)?shù)據(jù):"+responsestr);if (!responsestr.equals("")) {response.setContentType("text/html;charset=UTF-8");response.getWriter().write(responsestr);//直接將完整的表單html輸出到頁(yè)面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)建訂單失敗;訂單金額或者訂單號(hào)數(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("####################請(qǐng)求結(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(支付寶支付成功過(guò)回調(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); // 將異步通知中收到的待驗(yàn)證所有參數(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驗(yàn)證簽名boolean signVerified = AlipaySignature.rsaCheckV1(params, aliPayConfig.getAliPayPublicKey(),aliPayConfig.getCharset(), aliPayConfig.getSigntype());if (signVerified) {logger.info("支付寶回調(diào)簽名認(rèn)證成功");// 按照支付結(jié)果異步通知中的描述,對(duì)支付結(jié)果中的業(yè)務(wù)內(nèi)容進(jìn)行1\2\3\4二次校驗(yàn),校驗(yàn)成功后在response中返回success,校驗(yàn)失敗返回failurethis.check(params);// 另起線程處理業(yè)務(wù)executorService.execute(new AliPayNotifyTask(params,payCallBackService));// 如果簽名驗(yàn)證正確,立即返回success,后續(xù)業(yè)務(wù)另起線程單獨(dú)處理// 業(yè)務(wù)處理失敗,可查看日志進(jìn)行補(bǔ)償,跟支付寶已經(jīng)沒(méi)多大關(guān)系。return "success";} else {logger.info("支付寶回調(diào)簽名認(rèn)證失敗,signVerified=false, paramsJson:{}", paramsJson);return "failure";}} catch (AlipayApiException e) {logger.error("支付寶回調(diào)簽名認(rèn)證失敗,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;}僅此供給大家,在大家有這方面的需求時(shí),少走彎路!如果對(duì)大家有用,請(qǐng)大家多多點(diǎn)贊支持!
尊重原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處
kung900519
https://blog.csdn.net/kung_com/article/details/89468673
https://www.jianshu.com/p/b0282b43007b
總結(jié)
以上是生活随笔為你收集整理的微信、支付宝二码合一扫码支付实现思路的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 浅谈易语言多线程 by逆风
- 下一篇: 基于JAVA毕业设计的超市管理系统