Httpclient编写微信高级群发接口

本文介绍了如何使用Httpclient库发送JSON数据,并提供了发送消息到微信公众平台API的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习如何使用Httpclient发送json数据

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;

import net.sf.json.JSONObject;


import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

/**
 * 对应微信公众平台API的:发送消息
 * @author zyk
 *
 */
public class SendMessage {
	
	/**
	 * 高级群发接口-上传图文消息素材【订阅号与服务号认证后均可用】
	 * @param access_token
	 * @param map
	 * @throws IOException
	 */
	public static String uploadnews(String access_token, HashMap map)
			throws IOException {
		String media_id = null;
		String url = "https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token="
				+ access_token;
		JSONObject jo = JSONObject.fromObject(map);
		@SuppressWarnings("deprecation")
		CloseableHttpClient client = HttpClients.createDefault();
		HttpPost httpPost = new HttpPost(url);
		StringEntity params = new StringEntity(jo.toString(),"UTF-8");
		httpPost.setEntity(params);
		CloseableHttpResponse httpResponse = null;
		try {
			httpResponse = client.execute(httpPost);
			HttpEntity entity = httpResponse.getEntity();
			String jsonString = EntityUtils.toString(entity);
			JSONObject fromObject = JSONObject.fromObject(jsonString);
			Object media_idObject = fromObject.get("media_id");
			if (media_idObject != null) {
				media_id = media_idObject.toString();
			}
			System.out.println("上传图文消息素材-返回值:"
					+ jsonString);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(httpResponse != null){
				httpResponse.close();
			}
			if(client != null){
				client.close();
			}
		}
		return media_id;
	}
}

根据json格式使用map和list进行构造

{
   "articles": [
		 {
                        "thumb_media_id":"qI6_Ze_6PtV7svjolgs-rN6stStuHIjs9_DidOHaj0Q-mwvBelOXCFZiq2OsIU-p",
                        "author":"xxx",
			 "title":"Happy Day",
			 "content_source_url":"www.qq.com",
			 "content":"content",
			 "digest":"digest",
                        "show_cover_pic":"1"
		 },
		 {
                        "thumb_media_id":"qI6_Ze_6PtV7svjolgs-rN6stStuHIjs9_DidOHaj0Q-mwvBelOXCFZiq2OsIU-p",
                        "author":"xxx",
			 "title":"Happy Day",
			 "content_source_url":"www.qq.com",
			 "content":"content",
			 "digest":"digest",
                        "show_cover_pic":"0"
		 }
   ]
}
		HashMap mapUp = new HashMap();
		HashMap SubMap = new HashMap();
		List list = new ArrayList();
		SubMap.put("thumb_media_id", "123456789");
		SubMap.put("author", "san_jose"));
		SubMap.put("title", "构造Json数据");
		SubMap.put("content_source_url","http://www.csdn.com");
		SubMap.put("content", "构造Json数据");
		SubMap.put("digest", "构造Json数据");
		SubMap.put("show_cover_pic", "1");
		list.add(SubMap);
		mapUp.put("articles", list);


### 微信支付公钥验签实现 #### 准备工作 为了能够顺利地完成微信支付的公钥验签操作,需要先准备好几个基础组件: - **HttpClient对象**:这是建立远程连接的基础,通过SDK创建此对象以便于后续的操作[^1]。 - **签名验证器**:用于执行具体的验签逻辑。该工具被独立定义出来以简化开发流程并提高代码可维护性。 - **平台证书管理**:定期更新来自微信服务器上的最新版平台证书文件,这些证书包含了用于验签所需的公钥信息。 #### 初始化 HttpClient 客户端实例 首先,需初始化 `ApacheHttpClient` 类的一个新实例来作为HTTP客户端。这一步骤对于发起HTTPS请求至关重要,因为所有的通信都应当基于安全协议之上进行。 ```java import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder; import org.apache.http.impl.client.CloseableHttpClient; // 构建 WeChat Pay 特定配置下的 HTTP Client WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create() .withMerchant("your_merchant_id", "your_serial_no", merchantPrivateKey) .withWechatpay("wechatpay_public_key"); CloseableHttpClient httpClient = builder.build(); ``` #### 下载最新的平台证书 确保始终使用最新的平台证书来进行数据校验非常重要。为此目的,建议设置一个定时任务周期性地从官方渠道拉取新的证书副本,并将其存储到本地缓存中供随时访问。 ```java import java.io.IOException; import java.util.List; public void updateCertificates() throws IOException { List<Certificate> certificates = CertificateDownloader.downloadLatestCertificates(httpClient); // 更新内存中的证书列表... } ``` #### 验证接收到的消息真实性 当接收到来自微信的通知消息时,应该立即对其进行有效性检查。具体做法是利用之前提到过的签名验证器以及当前有效的平台证书集合共同作用下完成这一过程。 ```java import com.wechat.pay.contrib.apache.httpclient.auth.Verification; import com.wechat.pay.contrib.apache.httpclient.exception.AuthException; boolean isValidSignature(String message, String signature) { try { Verification verification = new Verification(message.getBytes(), signature); return certificateStore.getCertificates().stream() .anyMatch(cert -> verification.verifyWithCertChain(List.of(cert))); } catch (AuthException e) { logger.error("Failed to verify the signature.", e); return false; } } ``` 以上就是关于如何集成 Apache HttpClient 与 WeChat Pay SDK 来实施可靠的公钥验签机制的大致介绍。希望上述指南能帮助理解整个过程中涉及的关键技术和最佳实践方法[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值