package com.mzl.flower.service.system;
|
|
import cn.binarywang.wx.miniapp.api.WxMaService;
|
import cn.binarywang.wx.miniapp.api.WxMaUserService;
|
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
|
import cn.binarywang.wx.miniapp.config.WxMaConfig;
|
import com.mzl.flower.base.cache.StringCacheClient;
|
import com.mzl.flower.config.WxMiniappProperties;
|
import com.mzl.flower.config.exception.ValidationException;
|
import com.mzl.flower.constant.Constants;
|
import com.mzl.flower.service.BaseService;
|
import lombok.extern.slf4j.Slf4j;
|
import me.chanjar.weixin.common.error.WxErrorException;
|
import me.chanjar.weixin.mp.config.WxMpConfigStorage;
|
import org.apache.commons.httpclient.HttpClient;
|
import org.apache.commons.httpclient.methods.GetMethod;
|
import org.apache.commons.httpclient.params.HttpClientParams;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.io.File;
|
import java.io.IOException;
|
import java.util.Map;
|
|
@Service
|
@Transactional
|
@Slf4j
|
public class WeChatService extends BaseService {
|
|
@Autowired
|
private StringCacheClient cacheClient;
|
|
@Autowired
|
private WxMaService maService;
|
|
@Autowired
|
private WxMpConfigStorage wxMpConfigStorage;
|
|
@Autowired
|
private WxMiniappProperties wxMiniappProperties;
|
|
/**
|
* 小程序获取会话信息-花店端
|
* @param code
|
* @return
|
* @throws WxErrorException
|
*/
|
public WxMaJscode2SessionResult getWxMaSessionInfo(String code) throws WxErrorException {
|
WxMaJscode2SessionResult result = maService.jsCode2SessionInfo(code);
|
|
return result;
|
}
|
|
public void getWxMaUserPhone(String code) throws WxErrorException {
|
WxMaUserService us = maService.getUserService();
|
WxMaJscode2SessionResult session = us.getSessionInfo(code);
|
//sessionKey, encryptedData, iv
|
us.getPhoneNoInfo(session.getSessionKey(), "", "");
|
}
|
|
/**
|
* 小程序获取openid
|
* @param code
|
* @return
|
* @throws IOException
|
*/
|
public Map<String, Object> getWechatOpenId(String code,String userType) throws IOException {
|
if (StringUtils.isEmpty(code)) {
|
throw new ValidationException("微信code为空");
|
}
|
String appId = null;
|
String secret = null;
|
if(Constants.USER_TYPE.customer.name().equals(userType)){
|
WxMiniappProperties.Miniapp customer = wxMiniappProperties.getCustomer();
|
appId = customer.getAppid();
|
secret = customer.getSecret();
|
}else if(Constants.USER_TYPE.partner.name().equals(userType)){
|
WxMiniappProperties.Miniapp customer = wxMiniappProperties.getPartner();
|
appId = customer.getAppid();
|
secret = customer.getSecret();
|
}else if(Constants.USER_TYPE.supplier.name().equals(userType)){
|
WxMiniappProperties.Miniapp customer = wxMiniappProperties.getSupplier();
|
appId = customer.getAppid();
|
secret = customer.getSecret();
|
}else{
|
throw new ValidationException("用户类型不支持");
|
}
|
String param = "?grant_type=authorization_code&appid=" + appId + "&secret=" + secret + "&js_code=" + code;
|
String url = "https://api.weixin.qq.com/sns/jscode2session" + param;
|
|
HttpClient http = new HttpClient();
|
http.getParams().setParameter(HttpClientParams.ALLOW_CIRCULAR_REDIRECTS, true);
|
|
GetMethod get = new GetMethod(url);
|
|
http.executeMethod(get);
|
String json = get.getResponseBodyAsString();
|
Map<String, Object> map = parseObject(json, Map.class);
|
Object errcode = map.get("errcode");
|
if(errcode != null){
|
String errmsg = (String)map.get("errmsg");
|
throw new ValidationException(errmsg);
|
}
|
|
return map;
|
}
|
|
/**
|
* 获取公众号accessToken
|
* @return
|
*/
|
public String getGZHAccessToken(){
|
String appId = wxMpConfigStorage.getAppId();
|
String secret = wxMpConfigStorage.getSecret();
|
|
return getAccessToken(appId, secret);
|
}
|
|
public String getAccessToken(String appId, String secret){
|
if(StringUtils.isEmpty(appId) || StringUtils.isEmpty(secret)){
|
return null;
|
}
|
String key = "WX_" + appId;
|
String token = cacheClient.get(key);
|
if(StringUtils.isEmpty(token)){
|
Map<String, Object> map = getAccessTokenFromWeiXin(appId, secret);
|
token = (String) map.get("access_token");
|
Integer expiresIn = (Integer) map.get("expires_in");
|
cacheClient.set(key, token, expiresIn - 100);
|
}
|
|
return token;
|
}
|
|
private Map<String, Object> getAccessTokenFromWeiXin(String appId, String secret){
|
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + secret;
|
try{
|
HttpClient http = new HttpClient();
|
GetMethod get = new GetMethod(url);
|
http.executeMethod(get);
|
String json = get.getResponseBodyAsString();
|
Map<String, Object> map = parseObject(json, Map.class);
|
Object errcode = map.get("errcode");
|
if(errcode != null){
|
String errmsg = (String)map.get("errmsg");
|
log.error(errcode + ":" + errmsg);
|
throw new ValidationException(errmsg);
|
}
|
|
return map;
|
}catch (IOException e){
|
log.error(e.getMessage(), e);
|
throw new ValidationException(e.getMessage());
|
}
|
}
|
|
}
|