一、微信登陆
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小时;