xiaoyong931011
2023-07-26 e96f7638e74cc24c075636c37e7ca5e713cd8742
短信认证
8 files modified
1 files added
210 ■■■■ changed files
src/main/java/cc/mrbird/febs/mall/controller/ApiLoginController.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/WxUpCodeDto.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/model/WxGenerateQrCodeDto.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java 22 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/util/WechatEventUtil.java 100 ●●●●● patch | view | raw | blame | history
src/main/resources/application-dev.yml 2 ●●● patch | view | raw | blame | history
src/test/java/cc/mrbird/febs/PayTest.java 54 ●●●●● patch | view | raw | blame | history
src/test/java/cc/mrbird/febs/ProfitTest.java 8 ●●●● patch | view | raw | blame | history
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")
src/main/java/cc/mrbird/febs/mall/dto/WxUpCodeDto.java
New file
@@ -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;
}
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,团长分享放图章特征码")
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);
}
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 {
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) {
    }
}
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
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);
//        }
    }
}
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}