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