src/main/java/cc/mrbird/febs/mall/controller/ApiLoginController.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/mall/dto/WxUpCodeDto.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/pay/model/WxGenerateQrCodeDto.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/pay/util/WechatEventUtil.java | ●●●●● patch | view | raw | blame | history | |
src/main/resources/application-dev.yml | ●●●●● patch | view | raw | blame | history | |
src/test/java/cc/mrbird/febs/PayTest.java | ●●●●● patch | view | raw | blame | history | |
src/test/java/cc/mrbird/febs/ProfitTest.java | ●●●●● 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}