diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java index 6bd501f3..7d1d6dcf 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java @@ -83,12 +83,10 @@ public interface WxMpService { * * 详情请见:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD.951-JS-SDK.E4.BD.BF.E7.94.A8.E6.9D.83.E9.99.90.E7.AD.BE.E5.90.8D.E7.AE.97.E6.B3.95 * - * @param timestamp 时间戳 - * @param noncestr 用户自己生成的随机字符串 * @param url url * @return */ - public String createJsapiSignature(long timestamp, String noncestr, String url) throws WxErrorException; + public WxMpJsapiSignature createJsapiSignature(String url) throws WxErrorException; /** *
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java
index 439c44df..9f719140 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java
@@ -42,10 +42,15 @@ import java.io.InputStream;
 import java.io.StringReader;
 import java.security.NoSuchAlgorithmException;
 import java.util.List;
+import java.util.Random;
 import java.util.UUID;
 
 public class WxMpServiceImpl implements WxMpService {
 
+  protected final String RANDOM_STR = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+
+  protected final Random RANDOM = new Random();
+
   protected final Logger log = LoggerFactory.getLogger(WxMpServiceImpl.class);
 
   /**
@@ -59,7 +64,7 @@ public class WxMpServiceImpl implements WxMpService {
   protected final Object globalJsapiTicketRefreshLock = new Object();
 
   protected WxMpConfigStorage wxMpConfigStorage;
-  
+
   protected CloseableHttpClient httpClient;
 
   protected HttpHost httpProxy;
@@ -143,20 +148,36 @@ public class WxMpServiceImpl implements WxMpService {
     return wxMpConfigStorage.getJsapiTicket();
   }
 
-  public String createJsapiSignature(long timestamp, String noncestr, String url) throws WxErrorException {
+  public WxMpJsapiSignature createJsapiSignature(String url) throws WxErrorException {
+    long timestamp = System.currentTimeMillis() / 1000;
+    String noncestr = getRandomStr();
     String jsapiTicket = getJsapiTicket(false);
     try {
-      return SHA1.genWithAmple(
+      String signature = SHA1.genWithAmple(
           "jsapi_ticket=" + jsapiTicket,
           "noncestr=" + noncestr,
           "timestamp=" + timestamp,
           "url=" + url
       );
+      WxMpJsapiSignature jsapiSignature = new WxMpJsapiSignature();
+      jsapiSignature.setTimestamp(timestamp);
+      jsapiSignature.setNoncestr(noncestr);
+      jsapiSignature.setUrl(url);
+      jsapiSignature.setSignature(signature);
+      return jsapiSignature;
     } catch (NoSuchAlgorithmException e) {
       throw new RuntimeException(e);
     }
   }
 
+  protected String getRandomStr() {
+    StringBuilder sb = new StringBuilder();
+    for (int i = 0; i < 16; i++) {
+      sb.append(RANDOM_STR.charAt(RANDOM.nextInt(RANDOM_STR.length())));
+    }
+    return sb.toString();
+  }
+
   public void customMessageSend(WxMpCustomMessage message) throws WxErrorException {
     String url = "https://api.weixin.qq.com/cgi-bin/message/custom/send";
     execute(new SimplePostRequestExecutor(), url, message.toJson());
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpJsapiSignature.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpJsapiSignature.java
new file mode 100644
index 00000000..a09c4082
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpJsapiSignature.java
@@ -0,0 +1,58 @@
+package me.chanjar.weixin.mp.bean.result;
+
+/**
+ * jspai signature
+ */
+public class WxMpJsapiSignature {
+
+  private String noncestr;
+
+  private String jsapiTicket;
+
+  private long timestamp;
+
+  private String url;
+
+  private String signature;
+
+  public String getSignature() {
+    return signature;
+  }
+
+  public void setSignature(String signature) {
+    this.signature = signature;
+  }
+
+  public String getNoncestr() {
+    return noncestr;
+  }
+
+  public void setNoncestr(String noncestr) {
+    this.noncestr = noncestr;
+  }
+
+  public String getJsapiTicket() {
+    return jsapiTicket;
+  }
+
+  public void setJsapiTicket(String jsapiTicket) {
+    this.jsapiTicket = jsapiTicket;
+  }
+
+  public long getTimestamp() {
+    return timestamp;
+  }
+
+  public void setTimestamp(long timestamp) {
+    this.timestamp = timestamp;
+  }
+
+  public String getUrl() {
+    return url;
+  }
+
+  public void setUrl(String url) {
+    this.url = url;
+  }
+
+}