新增获取微信服务器IP地址接口以及消息AES加密解密实现
This commit is contained in:
@@ -46,6 +46,7 @@ weixin.properties说明
|
||||
|
||||
> account={"appId":"appId","appSecret":"appSecret",
|
||||
> "token":"开放者的token 非必须","openId":"公众号的openid 非必须",
|
||||
> "encodingAesKey":"公众号设置了加密方式且为「安全模式」需要填入",
|
||||
> "mchId":"V3.x版本下的微信商户号",
|
||||
> "partnerId":"财付通的商户号","partnerKey":"财付通商户权限密钥Key",
|
||||
> "version":"针对微信支付的版本号(2,3),如果不填则按照mchId非空与否来判断",
|
||||
@@ -103,4 +104,8 @@ weixin.properties说明
|
||||
|
||||
* 2014-11-11
|
||||
|
||||
+ 自定义`assembly`将`weixin4j-base`工程也一起打包(`weixin4j-mp-api-full.jar`)
|
||||
+ 自定义`assembly`将`weixin4j-base`工程也一起打包(`weixin4j-mp-api-full.jar`)
|
||||
|
||||
* 2014-11-15
|
||||
|
||||
+ 新增获取`微信服务器IP地址接口`
|
||||
+21
-1
@@ -1,5 +1,8 @@
|
||||
package com.foxinmy.weixin4j.mp.api;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.alibaba.fastjson.TypeReference;
|
||||
import com.foxinmy.weixin4j.exception.WeixinException;
|
||||
@@ -72,4 +75,21 @@ public class HelperApi extends BaseApi {
|
||||
return response.getAsObject(new TypeReference<SemResult>() {
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取微信服务器IP地址
|
||||
*
|
||||
* @return IP地址
|
||||
* @see <a
|
||||
* href="http://mp.weixin.qq.com/wiki/index.php?title=%E8%8E%B7%E5%8F%96%E5%BE%AE%E4%BF%A1%E6%9C%8D%E5%8A%A1%E5%99%A8IP%E5%9C%B0%E5%9D%80">获取IP地址</a>
|
||||
* @throws WeixinException
|
||||
*/
|
||||
public List<String> getcallbackip() throws WeixinException {
|
||||
String getcallbackip_uri = getRequestUri("getcallbackip_uri");
|
||||
Token token = tokenHolder.getToken();
|
||||
Response response = request.post(String.format(getcallbackip_uri,
|
||||
token.getAccessToken()));
|
||||
return JSON.parseArray(response.getAsJson().getString("ip_list"),
|
||||
String.class);
|
||||
}
|
||||
}
|
||||
+2
@@ -72,6 +72,8 @@ updateremark_uri={api_cgi_url}/user/info/updateremark?access_token=%s
|
||||
template_send_uri={api_cgi_url}/message/template/send?access_token=%s
|
||||
# \u8bed\u4e49\u7406\u89e3
|
||||
semantic_uri={api_base_url}/semantic/semproxy/search?access_token=%s
|
||||
# \u5fae\u4fe1\u670d\u52a1\u5730\u5740
|
||||
getcallbackip_uri={api_cgi_url}/getcallbackip?access_token=%s
|
||||
|
||||
# \u8ba2\u5355\u67e5\u8be2
|
||||
orderquery_uri={api_base_url}/pay/orderquery?access_token=%s
|
||||
|
||||
+1
-2
@@ -49,7 +49,6 @@ public class PayAction {
|
||||
// V3 支付
|
||||
// 此处的openid为微信用户的openid
|
||||
WeixinAccount weixinAccount = ConfigUtil.getWeixinAccount();
|
||||
weixinAccount.setOpenId("用户的openId");
|
||||
payPackage = new PayPackageV3(weixinAccount, "用户openid", "商品描述",
|
||||
"系统内部订单号", 1d, "IP地址", TradeType.JSAPI);
|
||||
// V2 支付
|
||||
@@ -147,7 +146,7 @@ public class PayAction {
|
||||
*
|
||||
*
|
||||
* @param inputStream
|
||||
* 订单细腻
|
||||
* 订单回调
|
||||
* @return <xml><br>
|
||||
* <return_code>SUCCESS/FAIL</return_code><br>
|
||||
* <return_msg>如非空,为错误 原因签名失败参数格式校验错误</return_msg><br>
|
||||
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package com.foxinmy.weixin4j.mp.type;
|
||||
|
||||
public enum EncryptType {
|
||||
RAW, AES
|
||||
}
|
||||
@@ -2,6 +2,7 @@
|
||||
# \u516c\u4f17\u53f7\u4fe1\u606f
|
||||
account={"appId":"wx4ab8f8de58159a57","appSecret":"1d4eb0f4bf556aaed539f30ed05ca795",\
|
||||
"token":"\u5f00\u653e\u8005\u7684token \u975e\u5fc5\u987b","openId":"\u516c\u4f17\u53f7\u7684openid \u975e\u5fc5\u987b",\
|
||||
"encodingAesKey":"\u516c\u4f17\u53f7\u8bbe\u7f6e\u4e86\u52a0\u5bc6\u65b9\u5f0f\u4e14\u4e3a\u300c\u5b89\u5168\u6a21\u5f0f\u300d\u9700\u8981\u586b\u5165",\
|
||||
"mchId":"V3.x\u7248\u672c\u4e0b\u7684\u5fae\u4fe1\u5546\u6237\u53f7",\
|
||||
"version":3,\
|
||||
"partnerId":"\u8d22\u4ed8\u901a\u7684\u5546\u6237\u53f7","partnerKey":"\u8d22\u4ed8\u901a\u5546\u6237\u6743\u9650\u5bc6\u94a5Key",\
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
package com.foxinmy.weixin4j.mp.test;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.foxinmy.weixin4j.exception.WeixinException;
|
||||
import com.foxinmy.weixin4j.mp.api.HelperApi;
|
||||
|
||||
public class HelpTest extends TokenTest {
|
||||
private HelperApi helperApi;
|
||||
|
||||
@Before
|
||||
public void init() {
|
||||
helperApi = new HelperApi(tokenHolder);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getcallbackip() throws WeixinException {
|
||||
List<String> ipList = helperApi.getcallbackip();
|
||||
Assert.assertFalse(ipList.isEmpty());
|
||||
}
|
||||
}
|
||||
+64
@@ -0,0 +1,64 @@
|
||||
package com.foxinmy.weixin4j.mp.test.msg;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.foxinmy.weixin4j.exception.WeixinException;
|
||||
|
||||
public class AesMsgTest extends MessagePush {
|
||||
StringBuilder xmlSb = new StringBuilder();
|
||||
|
||||
@Test
|
||||
public void testValidate() throws WeixinException, IOException {
|
||||
String para = "?signature=0d2366aedb4f3531cfa4297c1e4ea7eece2311d9&echostr=2143641595566077626×tamp=1415951914&nonce=165976363";
|
||||
xmlSb.delete(0, xmlSb.length());
|
||||
String response = get(para);
|
||||
Assert.assertEquals("2143641595566077626", response);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testType1() throws WeixinException, IOException {
|
||||
String para = "?signature=6dd806a20a314723e78bc58742a1b98a7adfd151×tamp=1415979366&nonce=1865915590";
|
||||
xmlSb.delete(0, xmlSb.length());
|
||||
xmlSb.append("<xml>");
|
||||
xmlSb.append("<ToUserName><![CDATA[gh_248c6f91d64f]]></ToUserName>");
|
||||
xmlSb.append("<FromUserName><![CDATA[oyFLst1bqtuTcxK-ojF8hOGtLQao]]></FromUserName>");
|
||||
xmlSb.append("<CreateTime>1415979365</CreateTime>");
|
||||
xmlSb.append("<MsgType><![CDATA[event]]></MsgType>");
|
||||
xmlSb.append("<Event><![CDATA[CLICK]]></Event>");
|
||||
xmlSb.append("<EventKey><![CDATA[CHECKIN]]></EventKey>");
|
||||
xmlSb.append("</xml>");
|
||||
String response = push(para, xmlSb.toString());
|
||||
Assert.assertNotNull(response);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testType2() throws WeixinException, IOException {
|
||||
String para = "?signature=ad05f836772d1cbba1ff2edb7be4b9c9fb3a43d5×tamp=1415980001&nonce=1803216865&encrypt_type=raw&msg_signature=c0d38e9ca00548f7142627ec2908a4fe8481025e";
|
||||
xmlSb.delete(0, xmlSb.length());
|
||||
xmlSb.append("<xml>");
|
||||
xmlSb.append("<ToUserName><![CDATA[gh_248c6f91d64f]]></ToUserName>");
|
||||
xmlSb.append("<FromUserName><![CDATA[oyFLst1bqtuTcxK-ojF8hOGtLQao]]></FromUserName>");
|
||||
xmlSb.append("<CreateTime>1415980001</CreateTime>");
|
||||
xmlSb.append("<MsgType><![CDATA[event]]></MsgType>");
|
||||
xmlSb.append("<Event><![CDATA[CLICK]]></Event>");
|
||||
xmlSb.append("<EventKey><![CDATA[CHECKIN]]></EventKey>");
|
||||
xmlSb.append("</xml>");
|
||||
String response = push(para, xmlSb.toString());
|
||||
Assert.assertNotNull(response);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testType3() throws WeixinException, IOException {
|
||||
String para = "?signature=ad05f836772d1cbba1ff2edb7be4b9c9fb3a43d5×tamp=1415980001&nonce=1803216865&encrypt_type=aes&msg_signature=c0d38e9ca00548f7142627ec2908a4fe8481025e";
|
||||
xmlSb.delete(0, xmlSb.length());
|
||||
xmlSb.append("<xml>");
|
||||
xmlSb.append("<ToUserName><![CDATA[gh_248c6f91d64f]]></ToUserName>");
|
||||
xmlSb.append("<Encrypt><![CDATA[R6VQIWDR14XgSRLm25zc7V/WJYqK15gsUiMh0u/5GTMZME6jGtHkyfVN079ZPL065b+ZDq3TnoFKKtjtZlzcodY6Fm8+EujvtbTdVMMFSwdo8AwqVViAn09+DDfqPaNvbHUSiYsL3qlxArs1MH6APRUHFo7MU/piY1x2stJc8+kv28xtF+K8Aou0RuPO7PeQ18Zu/GkLnYNiI1E7UG31UYfOgVKcRjeE0PXa18iF5LBS8G/ce/l+/pH/DJWUBw5uXaqSOlo21tctlgLXu3bYUUkIu8tT49QwhHvRZILtO9icoyCNuTA7iTcHIdlAe1bD1S0ncmopIQCGmoU2/AXC2CCi6trONf3EPNKKKfDeQYHadnVZOg6kTX2cnYmHZLviYeLzjCKFSqSNkimoSKQ/Dcutpsq1D82NCwiExUZW4oo=]]></Encrypt>");
|
||||
xmlSb.append("</xml>");
|
||||
String response = push(para, xmlSb.toString());
|
||||
Assert.assertNotNull(response);
|
||||
}
|
||||
}
|
||||
+27
-7
@@ -3,12 +3,12 @@ package com.foxinmy.weixin4j.mp.test.msg;
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
import org.apache.http.HttpResponse;
|
||||
import org.apache.http.HttpStatus;
|
||||
import org.apache.http.StatusLine;
|
||||
import org.apache.http.client.HttpClient;
|
||||
import org.apache.http.client.methods.HttpGet;
|
||||
import org.apache.http.client.methods.HttpPost;
|
||||
import org.apache.http.entity.StringEntity;
|
||||
import org.apache.http.impl.client.DefaultHttpClient;
|
||||
@@ -18,20 +18,40 @@ import com.foxinmy.weixin4j.exception.WeixinException;
|
||||
|
||||
public class MessagePush {
|
||||
|
||||
private HttpClient httpClient;
|
||||
private final String server = "http://localhost:8090";
|
||||
private final HttpClient httpClient;
|
||||
private final HttpPost httpPost;
|
||||
private final HttpGet httpGet;
|
||||
|
||||
public MessagePush() {
|
||||
this.httpClient = new DefaultHttpClient();
|
||||
ResourceBundle config = ResourceBundle.getBundle("netty");
|
||||
httpClient = new DefaultHttpClient();
|
||||
httpPost = new HttpPost();
|
||||
httpPost.setURI(URI.create(String.format("http://localhost:%s",
|
||||
Integer.parseInt(config.getString("port")))));
|
||||
httpPost.setURI(URI.create(server));
|
||||
|
||||
httpGet = new HttpGet();
|
||||
httpGet.setURI(URI.create(server));
|
||||
}
|
||||
|
||||
public String get(String para) throws WeixinException, IOException {
|
||||
httpGet.setURI(URI.create(server + para));
|
||||
HttpResponse httpResponse = httpClient.execute(httpGet);
|
||||
return entity(httpResponse);
|
||||
}
|
||||
|
||||
public String push(String xml) throws WeixinException, IOException {
|
||||
return push("", xml);
|
||||
}
|
||||
|
||||
public String push(String para, String xml) throws WeixinException,
|
||||
IOException {
|
||||
httpPost.setURI(URI.create(server + para));
|
||||
httpPost.setEntity(new StringEntity(xml, StandardCharsets.UTF_8));
|
||||
HttpResponse httpResponse = httpClient.execute(httpPost);
|
||||
return entity(httpResponse);
|
||||
}
|
||||
|
||||
private String entity(HttpResponse httpResponse) throws WeixinException,
|
||||
IOException {
|
||||
StatusLine statusLine = httpResponse.getStatusLine();
|
||||
|
||||
int status = statusLine.getStatusCode();
|
||||
@@ -45,4 +65,4 @@ public class MessagePush {
|
||||
return EntityUtils.toString(httpResponse.getEntity(),
|
||||
StandardCharsets.UTF_8);
|
||||
}
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -7,6 +7,7 @@ import org.junit.Test;
|
||||
import com.foxinmy.weixin4j.mp.response.ArticleResponse;
|
||||
import com.foxinmy.weixin4j.mp.response.ImageResponse;
|
||||
import com.foxinmy.weixin4j.mp.response.MusicResponse;
|
||||
import com.foxinmy.weixin4j.mp.response.TextResponse;
|
||||
import com.foxinmy.weixin4j.mp.response.VideoResponse;
|
||||
import com.foxinmy.weixin4j.mp.response.VoiceResponse;
|
||||
import com.foxinmy.weixin4j.msg.BaseMessage;
|
||||
@@ -31,7 +32,7 @@ public class OutMsgTest {
|
||||
|
||||
@Test
|
||||
public void text() throws DocumentException {
|
||||
TextMessage message = new TextMessage("text", inMessage);
|
||||
TextResponse message = new TextResponse("text", inMessage);
|
||||
System.out.println(message.toXml());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user