WechatMiniProgram.java 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package utility.wechat.miniprogram;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import common.BaseClass;
  5. import common.YosException;
  6. import common.data.Rows;
  7. import common.data.db.DBConnect;
  8. import utility.tools.WebRequest;
  9. import utility.wechat.wechatpay.WechatPay;
  10. import java.util.Calendar;
  11. public class WechatMiniProgram extends BaseClass {
  12. private String appid="";
  13. private String secret;
  14. private String mch_id="";
  15. private String mch_key;
  16. private String systemclient;
  17. /**
  18. * 构造函数
  19. *
  20. * @param appid 前端指定appid
  21. * @param secret 前端指定secret
  22. */
  23. public WechatMiniProgram(String appid, String secret, String mch_id, String mch_key) {
  24. this.appid = appid;
  25. this.secret = secret;
  26. this.mch_id = mch_id;
  27. this.mch_key = mch_key;
  28. }
  29. /**
  30. * 构造函数
  31. *
  32. * @param systemclient 系统注册的微信应用操作端
  33. */
  34. public WechatMiniProgram(String systemclient) throws YosException {
  35. DBConnect dbConnect = new DBConnect();
  36. Rows rows = dbConnect.runSqlQuery("select appid,secret,mch_id,mch_key from sys_wechatapp where systemclient='" + systemclient + "'");
  37. if (rows.isNotEmpty()) {
  38. this.appid = rows.get(0).getString("appid");
  39. this.secret = rows.get(0).getString("secret");
  40. this.mch_id = rows.get(0).getString("mch_id");
  41. this.mch_key = rows.get(0).getString("mch_key");
  42. }
  43. this.systemclient = systemclient;
  44. }
  45. public String getMch_key() {
  46. return mch_key;
  47. }
  48. public String getAppId() {
  49. return appid;
  50. }
  51. /**
  52. * 根据code获取微信的openid和unionid
  53. *
  54. * @param wechat_code
  55. * @return
  56. */
  57. public WechatUserID getWechatUserID(String wechat_code) throws YosException {
  58. WechatUserID wechatUserID = new WechatUserID();
  59. WebRequest request = new WebRequest();
  60. String result = request.doGet("https://api.weixin.qq.com/sns/jscode2session?appid=" + appid + "&secret=" + secret + "&js_code=" + wechat_code + "&grant_type=authorization_code");
  61. JSONObject openidobject = JSONObject.parseObject(result);
  62. wechatUserID.setSucc(openidobject.containsKey("openid"));
  63. if (openidobject.containsKey("openid")) {
  64. wechatUserID.setOpenid(openidobject.getString("openid"));
  65. }
  66. if (openidobject.containsKey("unionid")) {
  67. wechatUserID.setUnionid(openidobject.getString("unionid"));
  68. }
  69. if (openidobject.containsKey("session_key")) {
  70. wechatUserID.setSession_key(openidobject.getString("session_key"));
  71. }
  72. wechatUserID.setResult(result);
  73. return wechatUserID;
  74. }
  75. /**
  76. * 获取微信用户手机号信息
  77. *
  78. * @param code
  79. * @return
  80. * @throws YosException
  81. */
  82. public JSONObject getWechatUserPhonenumber(String code) throws YosException {
  83. WebRequest webRequest = new WebRequest();
  84. JSONObject object = new JSONObject();
  85. object.put("code", code);
  86. String result = webRequest.doPost(object.toString(), "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + getAccessToken());
  87. JSONObject resultObject = JSON.parseObject(result);
  88. if (resultObject.containsKey("errcode") && resultObject.getInteger("errcode") == 0 && resultObject.containsKey("phone_info")) {
  89. JSONObject phone_infoObject = resultObject.getJSONObject("phone_info");
  90. phone_infoObject.remove("watermark");
  91. return phone_infoObject;
  92. }
  93. return resultObject;
  94. }
  95. /**
  96. * 创建一个微信小程序支付订单
  97. *
  98. * @param wechat_code 用户code
  99. * @param custip 客户端IP地址
  100. * @return
  101. */
  102. public String createPayOrder(String systemclient,String orderno, String trade_type, String wechat_code, String custip, String title,int order_amount) throws YosException {
  103. WechatPay wechatPay = new WechatPay(systemclient);
  104. return wechatPay.createPayOrder(orderno, trade_type, getWechatUserID(wechat_code).getOpenid(), custip, title, order_amount);
  105. }
  106. //有效期2小时,需定时刷新,重复获取将导致上次获取的失效
  107. private static String access_token = "";
  108. private static long access_token_timelimit = 0L;
  109. private String getAccessToken() throws YosException {
  110. long nowtime = Calendar.getInstance().getTimeInMillis();
  111. if (access_token_timelimit < nowtime) {
  112. String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + this.appid + "&secret=" + this.secret;
  113. String res = new WebRequest().doGet(url);
  114. JSONObject resobject = JSONObject.parseObject(res);
  115. if (resobject.containsKey("access_token")) {
  116. access_token = resobject.getString("access_token");
  117. access_token_timelimit = nowtime + 1000 * resobject.getIntValue("expires_in");
  118. }
  119. }
  120. return access_token;
  121. }
  122. public static void main(String[] args) throws YosException {
  123. Analysis analysis = new WechatMiniProgram("wechatsaletool").new Analysis();
  124. analysis.getVisitPage();
  125. }
  126. /**
  127. * 小程序数据分析
  128. */
  129. public class Analysis {
  130. /**
  131. * 新增或活跃用户的画像分布数据
  132. */
  133. public void getUserPortrait() throws YosException {
  134. WebRequest webRequest = new WebRequest();
  135. JSONObject object = new JSONObject();
  136. object.put("begin_date", "20220728");
  137. object.put("end_date", "20220728");
  138. String result = webRequest.doPost(object.toString(), "https://api.weixin.qq.com/datacube/getweanalysisappiduserportrait?access_token=" + getAccessToken());
  139. JSONObject resultObject = JSON.parseObject(result);
  140. System.out.println(resultObject);
  141. }
  142. /**
  143. * 访问页面。目前只提供按 page_visit_pv 排序的 top200。
  144. *
  145. * @throws YosException
  146. */
  147. public void getVisitPage() throws YosException {
  148. WebRequest webRequest = new WebRequest();
  149. JSONObject object = new JSONObject();
  150. object.put("begin_date", "20220727");
  151. object.put("end_date", "20220727");
  152. String result = webRequest.doPost(object.toString(), "https://api.weixin.qq.com/datacube/getweanalysisappidvisitpage?access_token=" + getAccessToken());
  153. JSONObject resultObject = JSON.parseObject(result);
  154. System.out.println(resultObject);
  155. }
  156. }
  157. }