GetWechatMiniOpenIdCmd.java 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package com.java110.user.cmd.wechat;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.java110.core.annotation.Java110Cmd;
  4. import com.java110.core.context.ICmdDataFlowContext;
  5. import com.java110.core.event.cmd.Cmd;
  6. import com.java110.core.event.cmd.CmdEvent;
  7. import com.java110.core.log.LoggerFactory;
  8. import com.java110.dto.wechat.SmallWeChatDto;
  9. import com.java110.intf.store.ISmallWechatV1InnerServiceSMO;
  10. import com.java110.intf.user.IUserAttrV1InnerServiceSMO;
  11. import com.java110.utils.cache.MappingCache;
  12. import com.java110.utils.constant.MappingConstant;
  13. import com.java110.utils.exception.CmdException;
  14. import com.java110.utils.util.Assert;
  15. import org.slf4j.Logger;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.http.ResponseEntity;
  18. import org.springframework.web.client.RestTemplate;
  19. import java.text.ParseException;
  20. import java.util.List;
  21. /**
  22. * 获取小程序的openId
  23. */
  24. @Java110Cmd(serviceCode = "wechat.getWechatMiniOpenId")
  25. public class GetWechatMiniOpenIdCmd extends Cmd {
  26. private final static Logger logger = LoggerFactory.getLogger(GetWechatMiniOpenIdCmd.class);
  27. @Autowired
  28. private RestTemplate outRestTemplate;
  29. @Autowired
  30. private ISmallWechatV1InnerServiceSMO smallWechatV1InnerServiceSMOImpl;
  31. @Autowired
  32. private IUserAttrV1InnerServiceSMO userAttrV1InnerServiceSMOImpl;
  33. @Override
  34. public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException {
  35. Assert.hasKeyAndValue(reqJson, "code", "未包含code");
  36. Assert.hasKeyAndValue(reqJson, "appId", "未包含小程序ID");
  37. }
  38. @Override
  39. public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException {
  40. String appId = "";
  41. String appSecret = "";
  42. if ("MALL".equals(reqJson.getString("appId"))) {
  43. appId = MappingCache.getValue(MappingConstant.MALL_WECHAT_DOMAIN, "wechatAppId");
  44. appSecret = MappingCache.getValue(MappingConstant.MALL_WECHAT_DOMAIN, "wechatAppSecret");
  45. } else {
  46. SmallWeChatDto smallWeChatDto = new SmallWeChatDto();
  47. smallWeChatDto.setAppId(reqJson.getString("appId"));
  48. List<SmallWeChatDto> smallWeChatDtos = smallWechatV1InnerServiceSMOImpl.querySmallWechats(smallWeChatDto);
  49. if (smallWeChatDtos == null || smallWeChatDtos.size() < 1) {
  50. throw new IllegalArgumentException("未配置小程序信息");
  51. }
  52. appId = smallWeChatDtos.get(0).getAppId();
  53. appSecret = smallWeChatDtos.get(0).getAppSecret();
  54. }
  55. ResponseEntity<String> responseEntity;
  56. String code = reqJson.getString("code");
  57. String urlString = "https://api.weixin.qq.com/sns/jscode2session?appid={appId}&secret={secret}&js_code={code}&grant_type={grantType}";
  58. String response = outRestTemplate.getForObject(
  59. urlString, String.class,
  60. appId,
  61. appSecret,
  62. code,
  63. "authorization_code");
  64. logger.debug("微信返回报文:" + response);
  65. //Assert.jsonObjectHaveKey(response, "errcode", "返回报文中未包含 错误编码,接口出错");
  66. JSONObject responseObj = JSONObject.parseObject(response);
  67. if (responseObj.containsKey("errcode") && !"0".equals(responseObj.getString("errcode"))) {
  68. throw new IllegalArgumentException("微信验证失败,可能是code失效" + responseObj);
  69. }
  70. String openId = responseObj.getString("openid");
  71. }
  72. }