Skip to content

Commit 4289bd5

Browse files
committed
binarywang#659 小程序增加上报用户数据后台接口
1 parent 0678e22 commit 4289bd5

File tree

5 files changed

+113
-29
lines changed

5 files changed

+113
-29
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package me.chanjar.weixin.common.util;
2+
3+
import lombok.extern.slf4j.Slf4j;
4+
import org.apache.commons.codec.binary.Hex;
5+
6+
import javax.crypto.Mac;
7+
import javax.crypto.spec.SecretKeySpec;
8+
import java.security.InvalidKeyException;
9+
import java.security.NoSuchAlgorithmException;
10+
11+
/**
12+
* <pre>
13+
* 签名工具类
14+
* Created by BinaryWang on 2018/7/11.
15+
* </pre>
16+
*
17+
* @author <a href="https://github.com/binarywang">Binary Wang</a>
18+
*/
19+
@Slf4j
20+
public class SignUtils {
21+
/**
22+
* HmacSHA256 签名算法
23+
*
24+
* @param message 签名数据
25+
* @param key 签名密钥
26+
*/
27+
public static String createHmacSha256Sign(String message, String key) {
28+
try {
29+
Mac sha256 = Mac.getInstance("HmacSHA256");
30+
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "HmacSHA256");
31+
sha256.init(secretKeySpec);
32+
byte[] bytes = sha256.doFinal(message.getBytes());
33+
return Hex.encodeHexString(bytes).toUpperCase();
34+
} catch (NoSuchAlgorithmException | InvalidKeyException e) {
35+
SignUtils.log.error(e.getMessage(), e);
36+
}
37+
38+
return null;
39+
}
40+
}

weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaUserService.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
66
import me.chanjar.weixin.common.error.WxErrorException;
77

8+
import java.util.Map;
9+
810
/**
911
* 用户信息相关操作接口.
1012
*
@@ -28,6 +30,16 @@ public interface WxMaUserService {
2830
*/
2931
WxMaUserInfo getUserInfo(String sessionKey, String encryptedData, String ivStr);
3032

33+
/**
34+
* 上报用户数据后台接口.
35+
* <p>小游戏可以通过本接口上报key-value数据到用户的CloudStorage。</p>
36+
* 文档参考https://developers.weixin.qq.com/minigame/dev/document/open-api/data/setUserStorage.html
37+
* @param kvMap 要上报的数据
38+
* @param sessionKey 通过wx.login 获得的登录态
39+
* @param openid
40+
*/
41+
void setUserStorage(Map<String, String> kvMap, String sessionKey, String openid) throws WxErrorException;
42+
3143
/**
3244
* 解密用户手机号信息.
3345
*

weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaUserServiceImpl.java

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,25 @@
11
package cn.binarywang.wx.miniapp.api.impl;
22

3-
import org.apache.commons.codec.digest.DigestUtils;
4-
53
import cn.binarywang.wx.miniapp.api.WxMaService;
64
import cn.binarywang.wx.miniapp.api.WxMaUserService;
75
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
86
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
97
import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
8+
import cn.binarywang.wx.miniapp.config.WxMaConfig;
109
import cn.binarywang.wx.miniapp.util.crypt.WxMaCryptUtils;
10+
import com.google.gson.JsonArray;
11+
import com.google.gson.JsonObject;
12+
import me.chanjar.weixin.common.error.WxError;
1113
import me.chanjar.weixin.common.error.WxErrorException;
14+
import me.chanjar.weixin.common.util.SignUtils;
15+
import org.apache.commons.codec.binary.Hex;
16+
import org.apache.commons.codec.digest.DigestUtils;
17+
18+
import javax.crypto.Mac;
19+
import javax.crypto.spec.SecretKeySpec;
20+
import java.security.InvalidKeyException;
21+
import java.security.NoSuchAlgorithmException;
22+
import java.util.Map;
1223

1324
/**
1425
* @author <a href="https://github.com/binarywang">Binary Wang</a>
@@ -30,6 +41,30 @@ public WxMaUserInfo getUserInfo(String sessionKey, String encryptedData, String
3041
return WxMaUserInfo.fromJson(WxMaCryptUtils.decrypt(sessionKey, encryptedData, ivStr));
3142
}
3243

44+
@Override
45+
public void setUserStorage(Map<String, String> kvMap, String sessionKey, String openid) throws WxErrorException {
46+
final WxMaConfig config = this.service.getWxMaConfig();
47+
JsonObject param = new JsonObject();
48+
JsonArray array = new JsonArray();
49+
for (Map.Entry<String, String> e : kvMap.entrySet()) {
50+
JsonObject jsonObject = new JsonObject();
51+
jsonObject.addProperty("key", e.getKey());
52+
jsonObject.addProperty("value", e.getValue());
53+
array.add(jsonObject);
54+
}
55+
param.add("kv_list", array);
56+
String params = param.toString();
57+
String signature = SignUtils.createHmacSha256Sign(params, sessionKey);
58+
String url = String.format("https://api.weixin.qq.com/wxa/set_user_storage" +
59+
"?appid=%s&signature=%s&openid=%s&sig_method=%s",
60+
config.getAppid(), signature, openid, "hmac_sha256");
61+
String result = this.service.post(url, params);
62+
WxError error = WxError.fromJson(result);
63+
if (error.getErrorCode() != 0) {
64+
throw new WxErrorException(error);
65+
}
66+
}
67+
3368
@Override
3469
public WxMaPhoneNumberInfo getPhoneNoInfo(String sessionKey, String encryptedData, String ivStr) {
3570
return WxMaPhoneNumberInfo.fromJson(WxMaCryptUtils.decrypt(sessionKey, encryptedData, ivStr));

weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaUserServiceImplTest.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package cn.binarywang.wx.miniapp.api.impl;
22

3+
import cn.binarywang.wx.miniapp.test.TestConfig;
4+
import com.google.common.collect.ImmutableMap;
5+
import jdk.nashorn.internal.ir.annotations.Immutable;
6+
import me.chanjar.weixin.common.error.WxErrorException;
37
import org.testng.annotations.*;
48

59
import cn.binarywang.wx.miniapp.api.WxMaService;
@@ -8,6 +12,8 @@
812
import cn.binarywang.wx.miniapp.test.ApiTestModule;
913
import com.google.inject.Inject;
1014

15+
import javax.management.ImmutableDescriptor;
16+
1117
import static org.testng.Assert.*;
1218

1319
/**
@@ -54,4 +60,17 @@ public void testGetPhoneNoInfo() {
5460
assertNotNull(phoneNoInfo);
5561
System.out.println(phoneNoInfo.toString());
5662
}
63+
64+
@Test
65+
public void testGetSessionInfo() {
66+
}
67+
68+
/**
69+
* TODO 测试数据有问题,需要替换为正确的数据
70+
*/
71+
@Test
72+
public void testSetUserStorage() throws WxErrorException {
73+
this.wxService.getUserService().setUserStorage(ImmutableMap.of("1","2"),
74+
"r7BXXKkLb8qrSNn05n0qiA",((TestConfig)this.wxService.getWxMaConfig()).getOpenid());
75+
}
5776
}

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/util/SignUtils.java

Lines changed: 5 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,12 @@
66
import com.google.common.collect.Lists;
77
import com.google.common.collect.Maps;
88
import com.thoughtworks.xstream.annotations.XStreamAlias;
9-
import me.chanjar.weixin.common.util.BeanUtils;
10-
import org.apache.commons.codec.binary.Hex;
9+
import lombok.extern.slf4j.Slf4j;
1110
import org.apache.commons.codec.digest.DigestUtils;
1211
import org.apache.commons.lang3.StringUtils;
13-
import org.slf4j.Logger;
14-
import org.slf4j.LoggerFactory;
1512

16-
import javax.crypto.Mac;
17-
import javax.crypto.spec.SecretKeySpec;
1813
import java.lang.reflect.Field;
1914
import java.lang.reflect.Modifier;
20-
import java.security.InvalidKeyException;
21-
import java.security.NoSuchAlgorithmException;
2215
import java.util.*;
2316

2417
/**
@@ -29,9 +22,8 @@
2922
*
3023
* @author <a href="https://github.com/binarywang">binarywang(Binary Wang)</a>
3124
*/
25+
@Slf4j
3226
public class SignUtils {
33-
private static final Logger log = LoggerFactory.getLogger(SignUtils.class);
34-
3527
/**
3628
* 请参考并使用 {@link #createSign(Object, String, String, boolean)}.
3729
*/
@@ -91,26 +83,12 @@ public static String createSign(Map<String, String> params, String signType, Str
9183

9284
toSign.append("key=").append(signKey);
9385
if (SignType.HMAC_SHA256.equals(signType)) {
94-
return createHmacSha256Sign(toSign.toString(), signKey);
86+
return me.chanjar.weixin.common.util.SignUtils.createHmacSha256Sign(toSign.toString(), signKey);
9587
} else {
9688
return DigestUtils.md5Hex(toSign.toString()).toUpperCase();
9789
}
9890
}
9991

100-
private static String createHmacSha256Sign(String message, String key) {
101-
try {
102-
Mac sha256 = Mac.getInstance("HmacSHA256");
103-
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "HmacSHA256");
104-
sha256.init(secretKeySpec);
105-
byte[] bytes = sha256.doFinal(message.getBytes());
106-
return Hex.encodeHexString(bytes).toUpperCase();
107-
} catch (NoSuchAlgorithmException | InvalidKeyException e) {
108-
log.error(e.getMessage(), e);
109-
}
110-
111-
return null;
112-
}
113-
11492
/**
11593
* 校验签名是否正确.
11694
*
@@ -146,11 +124,11 @@ public static Map<String, String> xmlBean2Map(Object bean) {
146124
Map<String, String> result = Maps.newHashMap();
147125
List<Field> fields = new ArrayList<>(Arrays.asList(bean.getClass().getDeclaredFields()));
148126
fields.addAll(Arrays.asList(bean.getClass().getSuperclass().getDeclaredFields()));
149-
if(bean.getClass().getSuperclass().getSuperclass() == BaseWxPayRequest.class){
127+
if (bean.getClass().getSuperclass().getSuperclass() == BaseWxPayRequest.class) {
150128
fields.addAll(Arrays.asList(BaseWxPayRequest.class.getDeclaredFields()));
151129
}
152130

153-
if(bean.getClass().getSuperclass().getSuperclass() == BaseWxPayResult.class){
131+
if (bean.getClass().getSuperclass().getSuperclass() == BaseWxPayResult.class) {
154132
fields.addAll(Arrays.asList(BaseWxPayResult.class.getDeclaredFields()));
155133
}
156134

0 commit comments

Comments
 (0)