微信登陆、支付接口对接整理

一、微信登陆

1、根据code获取对应的openid

微信中同一个小程序用户的openid为唯一的,是判定用户身份的重要标识。

	@ApiModel(value = "微信登陆请求vo")
    public class WxReq {
    
    
        @ApiModelProperty("小程序 appId")
        private String appid;

        @ApiModelProperty("小程序 appSecret")
        private String secret;

        @ApiModelProperty("登录时获取的 code")
        private String js_code;

        @ApiModelProperty("授权类型,此处只需填写 authorization_code")
        private String grant_type = "authorization_code";
    }

    /**
     * 获取openid
     * @param code
     * @return
     */
    public WxRes getOpenidByCode(String code){
    
    
        WxReq req = new WxReq();
        req.setAppid(appid);
        req.setSecret(secret);
        req.setJs_code(code);
        JSONObject object = HttpUtilController.httpGetRequestMethod("https://api.weixin.qq.com/sns/jscode2session",req);
        WxRes res = JSON.parseObject(object.toJSONString(),WxRes.class);
        return res;
    }

参数code需要前端调用微信api进行获取,每个code使用一次即失效
httpGetRequestMethod方法就是模拟get调用的自用通用工具类。

2、请求解密

如果需要获取用户手机号等个人信息,需用户同意之后通过AES解密的方式调用获取

    @ApiModel(value = "DecodeVo", description = "微信解密请求实体")
    public class DecodeVo{
    
    

        @ApiModelProperty("加密字符串")
        private String str;

        @ApiModelProperty("微信登录code值")
        private String code;

        @ApiModelProperty("偏移")
        private String vi;
    }

    public String decodeInfo(DecodeVo decodeVo) {
    
    
        //1、获取openid
        WxRes res = getOpenidByCode(decodeVo.getCode());
        String key = res.getSession_key();
        AES aes = new AES(Mode.CBC, Padding.PKCS5Padding, Base64.decode(key), Base64.decode(decodeVo.getVi()));
        String decryptStr = aes.decryptStr(decodeVo.getStr(), CharsetUtil.CHARSET_UTF_8);
        return decryptStr;
    }

AES对象是hutool中的工具对象。

二、微信支付

微信支付这边用了github上的一个工具类,香的雅痞。

        <!-- 微信支付 -->
        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-pay</artifactId>
            <version>4.0.0</version>
        </dependency>
1、统一下单接口
	/**
     * 调用统一下单接口,并组装生成支付所需参数对象.
     *
     * @return 返回 {@link com.github.binarywang.wxpay.bean.order}包下的类对象
     */
    public WxPayOrderResult createOrder(WxPayUnifiedOrderRequest request, String openid){
    
    
        WxPayOrderResult wxPayOrderResult = new WxPayOrderResult();
        wxPayOrderResult.setCjsj(LocalDateTime.now());
        try {
    
    
            request.setOpenid(openid);
            request.setSpbillCreateIp(String.valueOf(InetAddress.getLocalHost().getHostAddress()));
            request.setTimeStart(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
            WxPayMpOrderResult payResult = wxService.createOrder(request);
        }catch (Exception e){
    
    
            e.printStackTrace();
        }
    }

    /**
     * 关闭订单
     * @param request
     * @return
     * @throws Exception
     */
    public WxPayOrderCloseResult closeOrder(WxPayOrderCloseRequest request) throws WxPayException {
    
    
        WxPayOrderCloseResult result = this.wxService.closeOrder(request);
        WxPayOrderQueryRequest wxPayOrderQueryRequest = new WxPayOrderQueryRequest();
        wxPayOrderQueryRequest.setOutTradeNo(request.getOutTradeNo());
        queryOrder(wxPayOrderQueryRequest);
        return result;
    }

    /**
     * 查询订单
     * @param request
     * @return
     * @throws Exception
     */
    public WxPayOrderQueryResult queryOrder(WxPayOrderQueryRequest request) throws WxPayException{
    
    
        WxPayOrderQueryResult result = this.wxService.queryOrder(request);
        WxPayOrderResult wxPayOrderResult = wxPayOrderMapper.getByDdbh(request.getOutTradeNo());
        return result;
    }

WxPayUnifiedOrderRequest、WxPayMpOrderResult对象都是工具类中的对象,用就是了。
需要注意的点:1、单价为0元不能生成订单;2、微信订单只生效2小时;

猜你喜欢

转载自blog.csdn.net/qq_16253859/article/details/122237741