From e96f7638e74cc24c075636c37e7ca5e713cd8742 Mon Sep 17 00:00:00 2001 From: xiaoyong931011 <15274802129@163.com> Date: Wed, 26 Jul 2023 12:35:50 +0800 Subject: [PATCH] 短信认证 --- src/main/java/cc/mrbird/febs/mall/controller/ApiLoginController.java | 9 ++ src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java | 3 src/test/java/cc/mrbird/febs/ProfitTest.java | 8 + src/main/java/cc/mrbird/febs/pay/model/WxGenerateQrCodeDto.java | 2 src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java | 22 +++++ src/main/java/cc/mrbird/febs/pay/util/WechatEventUtil.java | 100 +++++++++++++++++++++++++ src/main/resources/application-dev.yml | 2 src/test/java/cc/mrbird/febs/PayTest.java | 54 +++++++------ src/main/java/cc/mrbird/febs/mall/dto/WxUpCodeDto.java | 10 ++ 9 files changed, 182 insertions(+), 28 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiLoginController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiLoginController.java index ff89401..331d094 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ApiLoginController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiLoginController.java @@ -118,6 +118,15 @@ } /** + * 获取分享二维码 + */ + @ApiOperation(value = "获取上级二维码", notes = "获取上级二维码") + @GetMapping(value = "/getUpCode") + public FebsResponse getUpCode(@RequestBody WxUpCodeDto wxUpCodeDto){ + return iXcxPayService.getUpCode(wxUpCodeDto); + } + + /** * 获取ACCESS_TOKEN */ @ApiOperation(value = "获取ACCESS_TOKEN", notes = "获取ACCESS_TOKEN") diff --git a/src/main/java/cc/mrbird/febs/mall/dto/WxUpCodeDto.java b/src/main/java/cc/mrbird/febs/mall/dto/WxUpCodeDto.java new file mode 100644 index 0000000..8e33486 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/dto/WxUpCodeDto.java @@ -0,0 +1,10 @@ +package cc.mrbird.febs.mall.dto; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +@Data +@ApiModel(value = "WxUpCodeDto", description = "接收参数类") +public class WxUpCodeDto { + private String inviteId; +} diff --git a/src/main/java/cc/mrbird/febs/pay/model/WxGenerateQrCodeDto.java b/src/main/java/cc/mrbird/febs/pay/model/WxGenerateQrCodeDto.java index 6fa01a2..e2817c7 100644 --- a/src/main/java/cc/mrbird/febs/pay/model/WxGenerateQrCodeDto.java +++ b/src/main/java/cc/mrbird/febs/pay/model/WxGenerateQrCodeDto.java @@ -17,7 +17,7 @@ @ApiModelProperty(value = "参数 订单id 例如 15") private String scene; - @ApiModelProperty(value = "1:商品分享 2:团长分享") + @ApiModelProperty(value = "1:商品分享 2:邀请码") private Integer type; @ApiModelProperty(value = "商品分享传商品ID,团长分享放图章特征码") diff --git a/src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java b/src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java index fe0ec26..682e841 100644 --- a/src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java +++ b/src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java @@ -3,6 +3,7 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.dto.ApiRechargeWalletDto; import cc.mrbird.febs.mall.dto.RechargeWalletMessageSendDto; +import cc.mrbird.febs.mall.dto.WxUpCodeDto; import cc.mrbird.febs.mall.entity.MallOrderInfo; import cc.mrbird.febs.pay.model.BrandWCPayRequestData; import cc.mrbird.febs.pay.model.MemberWithdrawalDto; @@ -55,4 +56,6 @@ Boolean memberWithdrawal(MemberWithdrawalDto info); FebsResponse getQrCode(WxGenerateQrCodeDto wxGenerateQrCodeDto); + + FebsResponse getUpCode(WxUpCodeDto wxUpCodeDto); } diff --git a/src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java b/src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java index 69527a8..4b721d4 100644 --- a/src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java @@ -8,6 +8,7 @@ import cc.mrbird.febs.common.utils.*; import cc.mrbird.febs.mall.dto.ApiRechargeWalletDto; import cc.mrbird.febs.mall.dto.RechargeWalletMessageSendDto; +import cc.mrbird.febs.mall.dto.WxUpCodeDto; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.IMallMoneyFlowService; @@ -15,6 +16,7 @@ import cc.mrbird.febs.pay.model.*; import cc.mrbird.febs.pay.service.IXcxPayService; import cc.mrbird.febs.pay.util.WechatConfigure; +import cc.mrbird.febs.pay.util.WechatEventUtil; import cc.mrbird.febs.pay.util.WeixinServiceUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.text.StrFormatter; @@ -64,6 +66,8 @@ @Autowired private MallMemberWithdrawMapper mallMemberWithdrawMapper; private final IMallMoneyFlowService mallMoneyFlowService; + @Autowired + WechatEventUtil wechatEventUtil; @Autowired RedisUtils redisUtils; @@ -184,6 +188,24 @@ // } return new FebsResponse().success(); } + @Override + public FebsResponse getUpCode(WxUpCodeDto wxUpCodeDto) { + if(ObjectUtil.isEmpty(wxUpCodeDto.getInviteId())){ + return new FebsResponse().fail().message("邀请码不存在"); + } + String inviteId = wxUpCodeDto.getInviteId(); + MallMember mallMember = mallMemberMapper.selectInfoByInviteId(inviteId); + if(ObjectUtil.isEmpty(mallMember)){ + return new FebsResponse().fail().message("邀请码不存在"); + } + //前两个参数没用 + String ticket = wechatEventUtil.getTicket(inviteId); + if(StrUtil.isEmpty(ticket)){ + return new FebsResponse().fail().message("临时带参二维码ticket失败"); + } + String qRcode = wechatEventUtil.getQRcode(ticket); + return new FebsResponse().success().data(qRcode); + } @Override public BrandWCPayRequestData startPayment(MallOrderInfo mallOrderInfo) throws Exception { diff --git a/src/main/java/cc/mrbird/febs/pay/util/WechatEventUtil.java b/src/main/java/cc/mrbird/febs/pay/util/WechatEventUtil.java index d6ed6aa..b4fa899 100644 --- a/src/main/java/cc/mrbird/febs/pay/util/WechatEventUtil.java +++ b/src/main/java/cc/mrbird/febs/pay/util/WechatEventUtil.java @@ -1,10 +1,23 @@ package cc.mrbird.febs.pay.util; +import cc.mrbird.febs.common.utils.MallUtils; +import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.rabbit.producter.AgentProducer; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.text.StrFormatter; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import org.dom4j.io.SAXReader; import javax.servlet.http.HttpServletRequest; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileOutputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; @@ -15,6 +28,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; import java.io.InputStream; import java.util.*; @@ -211,4 +225,90 @@ return ""; } + + @Autowired + RedisUtils redisUtils; + + /** + * 获取ticket + * + * @param qrCodeParam + * @return + */ + public String getTicket(String qrCodeParam) { + RestTemplate restTemplate = new RestTemplate(); + String ticket = null; + // 拼接请求地址 + String CREATE_QRCODE_URL = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN"; + String requestUrl = CREATE_QRCODE_URL.replace("TOKEN", "70_ECdQaX-QtNXZP9ugU_JEJGRYEADWrlQZNYrT2I2IRHsx6hx4_O8RY4VasWI97_ixia8vANTdnNRI_cT00toK7CX98513sQI8535eTFw3b-VQChEFZrRqTfNPdSoGYXgAIAVNM"); +// String requestUrl = CREATE_QRCODE_URL.replace("TOKEN", redisUtils.get(WechatConfigure.WX_ACCESS_TOKEN_REDIS_KEY).toString()); + // 创建临时带参二维码 + + JSONObject jsonObject = restTemplate.postForObject(requestUrl, + "{\"expire_seconds\": 604800, \"action_name\": \"QR_STR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\": "+qrCodeParam+"}}}", + JSONObject.class); +// JSONObject jsonObject = HttpsUtil.request(requestUrl, "POST", "{\"expire_seconds\": 604800, \"action_name\": \"QR_SCENE\", \"action_info\": {\"scene\": {\"scene_id\": 123}}}"); + if (ObjectUtil.isNotEmpty(jsonObject)) { + String response = JSON.toJSONString(jsonObject); + if (!jsonObject.containsKey("errcode")) { + ticket = jsonObject.getString("ticket"); + System.out.println("临时带参二维码ticket成功" + response); + } else { + log.error("临时带参二维码ticket失败:" + response); + } + } + return ticket; + } + + /** + * 通过ticket换取二维码并保存二维码图片 + * + * @param ticket + * @param savePath + * @return + */ + //图片上传路径 + public static final String IMG_UPLOAD_PATH="/home/javaweb/webresource/ywg/wxcode"; + public String getQRcode(String ticket) { + + String SHOW_QRCODE_URL = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET"; + String requestUrl = SHOW_QRCODE_URL.replace("TICKET", ticket); + + String randomNum = MallUtils.getRandomNum(5); + String imgName="/user_" + randomNum + "_acode_1.jpg"; + String urlPrefix="https://ywgpzapi.meiao.biz/ywg/wxcode"; + String imgPath=IMG_UPLOAD_PATH+imgName; + if(!FileUtil.exist(imgPath)){ + try { + HttpResponse execute = HttpRequest.get(requestUrl).execute(); + InputStream inputStream = execute.bodyStream(); + File file = new File(imgPath); + FileUtil.writeFromStream(inputStream, file); + long uploadUrl = FileUtil.size(file); + //小于10kb重新生成 + if(uploadUrl<=10240){ + log.error("生成微信小程序码失败:图片大小异常:{}",uploadUrl); + return null; + } + } catch (Exception e) { + log.error("生成微信小程序码失败",e); + return null; + } + }else{ + + //判断文件是否正常 不正常 删除 + File file = new File(imgPath); + long uploadUrl = FileUtil.size(file); + if(uploadUrl<=10240){ + FileUtil.del(file); + return null; + } + } + System.out.println("根据ticket换取二维码成功,路径:" + imgPath); + return urlPrefix+"/"+imgName; + + } + + public static void main(String[] args) { + } } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 5d8132b..3b930fd 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -70,7 +70,7 @@ xcx: wechar_login_url: https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code xcx_appid: wx052716b1a388b13c - xcx_secret: e7cf355e7234f035d8fea6a3a19513b9 + xcx_secret: a217fd6bd36b4939e29a052fd5ba6984 debug: false wecharPaynotifyUrl: https://ywgpzapi.meiao.biz/api/xcxPay/wxpayCallback wecharRechargePaynotifyUrl: https://ywgpzapi.meiao.biz/api/xcxPay/rechargeCallBack diff --git a/src/test/java/cc/mrbird/febs/PayTest.java b/src/test/java/cc/mrbird/febs/PayTest.java index 01314e0..ab2f52b 100644 --- a/src/test/java/cc/mrbird/febs/PayTest.java +++ b/src/test/java/cc/mrbird/febs/PayTest.java @@ -4,6 +4,7 @@ import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.common.utils.SpringContextHolder; import cc.mrbird.febs.pay.util.WechatConfigure; +import cc.mrbird.febs.pay.util.WechatEventUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; import com.alipay.api.AlipayApiException; @@ -27,36 +28,41 @@ @SpringBootTest public class PayTest { - @Autowired private RedisUtils redisUtils; @Resource RestTemplate restTemplate; + @Resource + WechatEventUtil wechatEventUtil; @Test public void aliPay(){ + //前两个参数没用 + String ticket = wechatEventUtil.getTicket("123456"); + String qRcode = wechatEventUtil.getQRcode(ticket); + System.out.println(qRcode); - String appId = "wxfb1acf504eb9d058"; - String appSecret = "7ee226a964b1be7cfb96f5e0dc739c44"; - String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret; - String jsonStr = restTemplate.getForObject(url, String.class); - - /** - * 返回结果 - * {"access_token":"ACCESS_TOKEN","expires_in":7200} - */ - if (!jsonStr.contains("access_token")) { - System.out.println("获取微信access_token失败"); - } - - String accessTokenKey = WechatConfigure.WX_ACCESS_TOKEN_REDIS_KEY; - JSONObject jsonObject = JSONObject.parseObject(jsonStr); - String accessToken = jsonObject.getString(accessTokenKey); - if (StrUtil.isEmpty(accessToken)) { - log.error("获取access token失败: {}" , jsonObject.getString("errmsg")); - throw new ApiException("获取access token失败"); - } else { - log.info("wx access_token : {}",accessToken); - redisUtils.set(accessTokenKey,accessToken); - } +// String appId = "wxfb1acf504eb9d058"; +// String appSecret = "7ee226a964b1be7cfb96f5e0dc739c44"; +// String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret; +// String jsonStr = restTemplate.getForObject(url, String.class); +// +// /** +// * 返回结果 +// * {"access_token":"ACCESS_TOKEN","expires_in":7200} +// */ +// if (!jsonStr.contains("access_token")) { +// System.out.println("获取微信access_token失败"); +// } +// +// String accessTokenKey = WechatConfigure.WX_ACCESS_TOKEN_REDIS_KEY; +// JSONObject jsonObject = JSONObject.parseObject(jsonStr); +// String accessToken = jsonObject.getString(accessTokenKey); +// if (StrUtil.isEmpty(accessToken)) { +// log.error("获取access token失败: {}" , jsonObject.getString("errmsg")); +// throw new ApiException("获取access token失败"); +// } else { +// log.info("wx access_token : {}",accessToken); +// redisUtils.set(accessTokenKey,accessToken); +// } } } diff --git a/src/test/java/cc/mrbird/febs/ProfitTest.java b/src/test/java/cc/mrbird/febs/ProfitTest.java index fa3a8ef..98a4691 100644 --- a/src/test/java/cc/mrbird/febs/ProfitTest.java +++ b/src/test/java/cc/mrbird/febs/ProfitTest.java @@ -136,11 +136,15 @@ @Test public void getWeChatAccessToken() { - String appId = "wx5cc58f796224af61"; - String appSecret = "71403646f666f9b9dca308d4f357765c"; + + // 第三方用户唯一凭证 + String appId = "wx052716b1a388b13c"; + // 第三方用户唯一凭证密钥 + String appSecret = "a217fd6bd36b4939e29a052fd5ba6984"; String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret; String jsonStr = restTemplate.getForObject(url, String.class); + /** * 返回结果 * {"access_token":"ACCESS_TOKEN","expires_in":7200} -- Gitblit v1.9.1