欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java微信小程序后台(支付 授权登陆)

程序员文章站 2022-04-03 08:54:04
...

1.微信小程序后台(支付 授权登陆)

1.添加微信依赖(用的是git上面 binarywang包)

<!--支付开发包 -->
<dependency>
    <groupId>com.github.binarywang</groupId>
    <artifactId>weixin-java-pay</artifactId>
    <version>3.8.0</version>
</dependency>
<!-- 小程序 开发包-->
<dependency>
    <groupId>com.github.binarywang</groupId>
    <artifactId>weixin-java-miniapp</artifactId>
    <version>3.8.0</version>
</dependency>

2.相关配置

2.1application.yml配置

wx:
  pay:
    appId: #微信公众号或者小程序等的appid
    mchId: #微信支付商户号
    mchKey: #微信支付商户**
    appSecret: #应用**

2.2yaml配置参数类

@Data
@Component
@ConfigurationProperties(prefix = "wx.pay")  //前缀
@Primary  //覆盖 当有多个这个的WxPayProperties实现类 注入这个
public class WxPayProperties {
  /**
   * 设置微信公众号或者小程序等的appid
   */
  private String appId;

  /**
   * 微信支付商户号
   */
  private String mchId;

  /**
   * 微信支付商户**
   */
  private String mchKey;

  /**
   * 小程序**
   */
  private String appSecret;

}

2.3(bean注入 和配置)

/**
 * lijh
 */
@Configuration
@ConditionalOnClass(WxPayService.class) //引入WxPayService这个类 下面两个才会实例化
@EnableConfigurationProperties(WxPayProperties类.class) //注入WxPayProperties类
@AllArgsConstructor 
public class WxPayConfiguration {
    //配置文件类
  private WxPayProperties properties;

  @Bean
  @ConditionalOnMissingBean
  public WxPayService wxService() {
      //实例payConfig 设置固定参数
    WxPayConfig payConfig = new WxPayConfig();
    payConfig.setAppId(StringUtils.trimToNull(this.properties.getAppId()));
    payConfig.setMchId(StringUtils.trimToNull(this.properties.getMchId()));
    payConfig.setMchKey(StringUtils.trimToNull(this.properties.getMchKey()));
    payConfig.setSubAppId(StringUtils.trimToNull(this.properties.getSubAppId()));
    payConfig.setSubMchId(StringUtils.trimToNull(this.properties.getSubMchId()));
    payConfig.setKeyPath(StringUtils.trimToNull(this.properties.getKeyPath()));

    // 可以指定是否使用沙箱环境
    payConfig.setUseSandboxEnv(false);

    WxPayService wxPayService = new WxPayServiceImpl();
    wxPayService.setConfig(payConfig);
    return wxPayService;
  }

  @Bean
  @ConditionalOnMissingBean
  public WxMaService wxMaService() {
      //实例这个 WxMaConfig
    WxMaConfig wxMaConfig = new WxMaDefaultConfigImpl();
    ((WxMaDefaultConfigImpl) wxMaConfig).setAppid(StringUtils.trimToNull(this.properties.getAppId()));
    ((WxMaDefaultConfigImpl) wxMaConfig).setSecret(StringUtils.trimToNull(this.properties.getAppSecret()));
    WxMaService wxMaService = new WxMaServiceImpl();
      //设置配置文件
    wxMaService.setWxMaConfig(wxMaConfig);
    return wxMaService;
  }
}

3.代码实现

3.0 ResponseEntity实体类

/**
 * 返回统一对象
 *
 * @param
 * @return
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class ResponseEntity<T> {
    private Integer code;
    private String message;
    private T data;
    private Long expired_at;


    public static <T> ResponseEntity<T> ok() {
        return restResult(null, SUCCEED_CODE, null);
    }

    public static <T> ResponseEntity<T> ok(String msg) {
        return restResult(null, SUCCEED_CODE, msg);
    }

    public static <T> ResponseEntity<T> ok(T data) {
        return restResult(data, SUCCEED_CODE, null);
    }

    public static <T> ResponseEntity<T> ok(T data, String msg) {
        return restResult(data, SUCCEED_CODE, msg);
    }


    public static <T> ResponseEntity<T> response(ResponseCode responseCode) {
        return restResult(null, responseCode, null);
    }

    public static <T> ResponseEntity<T> response(ResponseCode responseCode, String msg) {
        return restResult(null, responseCode, msg);
    }

    public static <T> ResponseEntity<T> response(ResponseCode responseCode, T data) {
        return restResult(data, responseCode, null);
    }

    public static <T> ResponseEntity<T> response(ResponseCode responseCode, T data, String msg) {
        return restResult(data, responseCode, msg);
    }

    private static <T> ResponseEntity<T> restResult(T data, ResponseCode responseCode, String inputMessage) {
        ResponseEntity<T> responseEntity = new ResponseEntity<>();
        responseEntity.setCode(responseCode.getCode());
        responseEntity.setData(data);
        if (inputMessage == null) {
            responseEntity.setMessage(responseCode.getMessage());
        } else {
            responseEntity.setMessage(inputMessage);
        }
        responseEntity.setExpired_at(System.currentTimeMillis());
        return responseEntity;
    }
}

3.1 获取openId -通过前台生成的code 换取openId

@PostMapping("/code")
public ResponseEntity jsCode2SessionInfo(@RequestBody Map map){
    String code = MapUtils.getString(map, "code");
    if (StringUtils.isEmpty(code)){
        return ResponseEntity.response(ResponseCode.ERROR_CODE).setData("参数错误");
    }
    String result = "";
    try {
        WxMaJscode2SessionResult wxMaJscode2SessionResult = wxMaService.jsCode2SessionInfo(code);
        result = wxMaJscode2SessionResult.getOpenid();
    } catch (WxErrorException e) {
        e.printStackTrace();
    }
    return ResponseEntity.ok().setData(result);
}

3.2 微信支付 —统一下单

@PostMapping(value = "/wxpay")
    public ResponseEntity pay(HttpServletRequest request, @RequestBody Map map) {
        try {
            String openId = MapUtils.getString(map, "openId");
            WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
            orderRequest.setBody("赋强公证");
            //获取日期 流水号
            orderRequest.setOutTradeNo("订单编号");
            //金额
            orderRequest.setTotalFee(BaseWxPayRequest.yuanToFen(200));//元转成分
            //openId
            orderRequest.setOpenid(openId);
            //小程序 标识
            orderRequest.setTradeType("JSAPI");
            //数据回馈 地址
            orderRequest.setNotifyUrl(apiConstants.getSynResult());
            //获取ip地址
            InetAddress address = InetAddress.getLocalHost();
            String hostAddress = address.getHostAddress();
            orderRequest.setSpbillCreateIp(hostAddress);
            long currentTime = System.currentTimeMillis() ;
            //交易开始时间
            //设置时差
            TimeZone timeZone = TimeZone.getTimeZone("GMT+8");
            TimeZone.setDefault(timeZone);
            String timeStart = new SimpleDateFormat("yyyyMMddHHmmss").format(currentTime);
            DateFormat format1 = new SimpleDateFormat("yyyyMMddHHmmss");
            orderRequest.setTimeStart(timeStart);
            //交易结束时间
            currentTime +=120*60*1000;
            String timeExpire = format1.format(new Date(currentTime));
            orderRequest.setTimeExpire(timeExpire);
            //订单 返回
            Object order = wxService.createOrder(orderRequest);
            Object json = JSONObject.toJSON(order);
            return ResponseEntity.response(ResponseCode.ERROR_CODE).setData(json);
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseEntity.response(ResponseCode.ERROR_CODE).setMessage("支付失败,请稍后重试!");
        }
    }

3.3微信支付-授权登陆

/**
     * 获取用户绑定手机号
     * @param map
     * @return
     */
    @PostMapping("/phone")
    public ResponseEntity phone(@RequestBody Map map){
        String code = MapUtils.getString(map, "code");
        if (StringUtils.isEmpty(code)){
            return ResponseEntity.response(RESPONSE_PARAMETER_ERROR,"项目编码不能为空");
        }
        String encryptedData = MapUtils.getString(map, "encryptedData");
        if (StringUtils.isEmpty(encryptedData)){
            return ResponseEntity.response(RESPONSE_PARAMETER_ERROR,"encryptedData不能为空");
        }
        String iv = MapUtils.getString(map, "iv");
        if (StringUtils.isEmpty(iv)){
            return ResponseEntity.response(RESPONSE_PARAMETER_ERROR,"iv不能为空");
        }
        WxMaJscode2SessionResult wxMaJscode2SessionResult = null;
        LoginUserDto loginUserDto = new LoginUserDto();
        ResponseEntity responseEntity = null;
        try {
            //获取session_key
            wxMaJscode2SessionResult = wxMaService.jsCode2SessionInfo(code);
            if (wxMaJscode2SessionResult == null){
                return ResponseEntity.response(ERROR_CODE,"code信息有误");
            }
            String  session_key = wxMaJscode2SessionResult.getSessionKey();
            //获取联系方式
            WxMaPhoneNumberInfo phoneNoInfo = wxMaService.getUserService().getPhoneNoInfo(session_key, encryptedData, iv);
            if (phoneNoInfo == null){
                return ResponseEntity.response(ERROR_CODE,"联系方式解密失败");
            }
            //根据联系方式 调用自定义登陆接口
            //String phoneNumber = phoneNoInfo.getPhoneNumber();
            //loginUserDto.setLoginNa(phoneNumber);
            //loginUserDto.setOp("app_wx");
            //调用登陆接口
            //responseEntity = ucUserService.loginUcUser(loginUserDto);
        } catch (WxErrorException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return responseEntity;
    }