项目描述:基于微信浏览器的H5页面,接入微信支付接口和微信红包接口

一、接入前准备条件

1.微信公众号

  需要基于已认证的微信公众号承载该H5页面。该条件默认已具备,本文重点为红包接口。

2.微信支付商户平台

2.1官方api文档,发放前准备事项,详细阅读!

https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_3&index=2

2.2重点内容解读

  1、在满足开通红包权限的前提条件下,在开通该权限时,微信支付平台需要操作人下载对应安全控件及证书,保证操作环境安全性!

  2、充值微信支付账号,大概意思是将银行中的钱预存到平台作为红包金池,已发放的红包金额将从该池中扣减。操作步骤见api文档。

  3、openid是微信用户在该公众号下的唯一标识,与微信号1对1映射,微信出于用户隐私考虑,使用虚拟id去关联微信用户,所以无法获取微信号。有这方面想法的同学趁早放弃...所以我们支付或发送红包使用openid即可。

  4、本文使用红包接口调用的方式实现红包发放功能,api文档中第五条相关参数设置可以略过!

二、红包api接入

1.官方api文档,发放普通红包

https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3

2.重点内容解读

2.1证书问题

  根据证书使用说明.txt中的描述,JAVA后端为例,使用的证书是.p12格式

  

  windows上可以直接双击导入系统,导入过程中会提示输入证书密码,证书密码默认为您的商户ID(如:10010000),在发送POST请求时一定要携带该证书的信息在请求中,具体见代码:

 /**
* url 请求url
xmlParam 请求参数
keyStorePath 本地证书路径
*/
public static Map getMwebUrl(String url, String xmlParam, String keyStorePath) {
StringBuffer message = new StringBuffer();
String jsonStr = null;
Map map = new HashMap();
try {
//商户id,证书的默认密码
String mchId = PropertyUtil.MERID;
KeyStore keyStore = KeyStore.getInstance("PKCS12");
//本地证书
FileInputStream instream = new FileInputStream(new File(keyStorePath));
keyStore.load(instream, mchId.toCharArray());
SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, mchId.toCharArray()).build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
//注意这里是post
HttpPost httpost = new HttpPost(url);
httpost.setEntity(new StringEntity(xmlParam, "UTF-8"));
System.out.println("executing request" + httpost.getRequestLine());
CloseableHttpResponse response = httpclient.execute(httpost); try {
HttpEntity entity = response.getEntity();
System.out.println(response.getStatusLine());
if (entity != null) {
System.out.println("Response content length: " + entity.getContentLength());
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent(),"UTF-8"));
//以下为返回参数的处理,根据需求自行修改
String text;
while ((text = bufferedReader.readLine()) != null) {
message.append(text);
}
jsonStr = message.toString();
map = XMLUtils.parseXmlToList(jsonStr);
}
EntityUtils.consume(entity);
} catch (IOException e) {
e.printStackTrace();
} finally {
response.close();
}
} catch (Exception e1) {
e1.printStackTrace();
}
return map;
}

2.2请求参数问题

  2019年8月该api请求必填参数为12个,详见api文档,这里只有签名sign字段需要说明,其余字段非常直观!

签名

详见签名生成算法,以下为sign参数生成代码,仅供参考

 /**
parameters 将所有非空参数装载进SortedMap
*/
public static String createSign(SortedMap<String,Object> parameters){
StringBuffer sb = new StringBuffer();
//所有参与传参的参数按照accsii排序(升序)
Set es = parameters.entrySet();
Iterator it = es.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String k = (String)entry.getKey();
Object v = entry.getValue();
//不能包含sign属性及key属性,不需要CDATA模板
if(null != v && !"".equals(v)
&& !"sign".equals(k) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
//商户平台设置的密钥key
//◆ key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
sb.append("key=" + PropertyUtil.SIGNKEY );
String sign = "";
try {
//MD5加密及中文支持,并转换成全大写
sign = MD5Utils.getMessageDigest(sb.toString().getBytes("utf-8")).toUpperCase();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return sign;
}

  补充 :nonce_str参数,随机字符串的生成算法

 import java.security.MessageDigest;
public class MD5Utils {
public final static String getMessageDigest(byte[] buffer) {
char hexDigits[] =
{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
try {
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
mdTemp.update(buffer);
byte[] md = mdTemp.digest();
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
return new String(str);
} catch (Exception e) {
return null;
}
}
}

三、总结

  在接触微信系列的内容之前,接收各种对微信api的吐槽,但是接触了之后发现,他们说的还真对...(甩梗,咳咳)相较阿里的api腾讯的参数描述、步骤指引等不够明确,但仍在可接受的范围之内,退一步讲,以前我没得选,现在也没得选!

微信企业红包api接入的更多相关文章

  1. JAVA微信企业付款到零钱(十分钟搞定),附完整DEMO下载

    最近帮朋友做了一个简单的微分销系统,实现从企业付款到零钱分润的功能,简单记录一下微信企业付款到零钱的开发过程, 主要就是按规则封装好请求参数调用微信接口,涉及一些签名校验: A.接口流程 1. 获取用 ...

  2. 企业微信开发之发放企业红包(C#)

    一.企业微信API 地址:http://work.weixin.qq.com/api/doc#11543 二.参数说明 1.发送企业红包 请求方式:POST(HTTPS)请求地址:https://ap ...

  3. 微信红包API接口(PHP)

    根据微信高级红包接口,开发PHP版本的API接口,现在进行主要代码分析. 红包接口调用请求代码,所有请求参数为必填参数与文档对应: class Wxapi { private $app_id = 'w ...

  4. 微信公众平台开发,API接入与推送事件(1)

    博客好久没有更新了,今天说说微信开发.微信开发的好多初学者都会又这样的迷惑,微信开发到底是什么?其实微信开发本质我和我们的网站开发没有太大的区别.我们常说的微信开发也就是公众号开,微信公众号分为三个类 ...

  5. 微信企业向用户银行卡付款API开发详解(PHP)

    最近在实现微信企业向用户银行卡付款时遇到了一些问题,发现官方文档说的太笼统,走了不少弯路,想要在此记录,希望可以帮到大家. 案例:企业付款到银行卡    微信接口链接:https://api.mch. ...

  6. C#开发微信门户及应用(34)--微信裂变红包

    在上篇随笔<C#开发微信门户及应用(33)--微信现金红包的封装及使用>介绍了普通现金红包的封装和使用,这种红包只能单独一次发给一个人,用户获取了红包就完成了,如果我们让用户收到红包后,可 ...

  7. 微信发红包 PHP 实现

    最近做生日营销,需要微信发红包,特此从网上找了一篇教程 首先你的有个服务号,并且开通了微信支付,我在这就不说怎么去申请和开通了,我是看了微信官方文档后,想看官方文档的朋友可以到下面这个链接 https ...

  8. 微信商户现金红包api php

    微信开发文档: 现金红包:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_5 裂变红包:https:// ...

  9. 使用nodejs调用微信发送红包

    前置条件:申请微信发送红包的账户及其权限 依赖 blueimg-md5和 xmlreader 库 /common/weixin.js 源码 /** * Created by chent696 on 2 ...

随机推荐

  1. Python命令行参数解析模块getopt使用实例

    Python命令行参数解析模块getopt使用实例 这篇文章主要介绍了Python命令行参数解析模块getopt使用实例,本文讲解了使用语法格式.短选项参数实例.长选项参数实例等内容,需要的朋友可以参 ...

  2. 在node.js中使用Set

    var set = new Set(); set.add(1); console.log("test1 : " + set.has(1) + " ; " + s ...

  3. asp.net下Response.ContentType类型汇总

    在ASP.NET中使用Response.ContentType="类型名";来确定输出格式 'ez' => 'application/andrew-inset', 'hqx' ...

  4. java的mock工具:mockito

    https://site.mockito.org https://github.com/mockito/mockito https://github.com/hehonghui/mockito-doc ...

  5. Docker 容器的运行(八)

    目录 一.运行容器 1.运行第一个容器 2.让容器长期运行 二.进入容器 1.attach 2.exec 3.attach VS exec 4.容器内部都在干些什么 三.停止/启动/重启容器 四.暂停 ...

  6. Spring-boot内置的程序管理监控工具-Actuator

    1.引入jar包: <dependencies> <dependency> <groupId>org.springframework.boot</groupI ...

  7. 三节课MINI计划第五周

    一.任务及干货 二.作品 (一)小组分工 (二)社群运营方案

  8. Netty学习笔记(二)——netty组件及其用法

    1.Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端. 原生NIO存在的问题 1) NIO的类库和API繁杂,使用麻烦:需要熟练掌握Selector.Se ...

  9. Python--yaml文件写入

    原文地址:https://www.cnblogs.com/yoyoketang/p/9255109.html yaml作为配置文件是非常友好的一种格式,前面一篇讲了yaml的一些基础语法和读取方法,本 ...

  10. vim字符匹配

    按 : 这个符号进入命令模式后,可以对文本信息进行替换.删除等操作.