项目描述:基于微信浏览器的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腾讯的参数描述、步骤指引等不够明确,但仍在可接受的范围之内,退一步讲,以前我没得选,现在也没得选!

最新文章

  1. OpenMP并行构造的schedule子句详解 (转载)
  2. 建议Javascript以后都用严格模式
  3. FZU 2212 Super Mobile Charger(超级充电宝)
  4. KMeans聚类算法Hadoop实现
  5. Hdu 5050 Divided Land
  6. AngularJS1.X学习笔记2-数据绑定
  7. Android 开源可缩放平移的绘画板
  8. javascript实现双向数据绑定
  9. spring-mvc访问本地html文件
  10. 环境准备—之—linux下安装python3和pip3
  11. 关键字New,如阴魂不散
  12. shell脚本之特殊符号总结性梳理
  13. python 惰性求值 https://blog.csdn.net/Appleyk/article/details/77334221
  14. IntelliJ IDEA平台下JNI编程(五)—本地C代码创建Java对象及引用
  15. Xlua使用教程、攻略
  16. Java读取json文件并对json数据进行读取、添加、删除与修改操作
  17. 64位Windows操作系统中的注冊表
  18. 使用新版SDK不想跳转微博客户端能否直接发送微博分享?
  19. EF---延迟加载技术
  20. FZU OJ 1075 :分解素因子

热门文章

  1. (十三)过滤器Filter(转)
  2. WPF引入OCX控件
  3. Python 解析式、生成器
  4. 关于类似QQ的展开和折叠效果的实现
  5. CentOS 7中安装和配置Promethues
  6. 并查集与最小生成树Kruskal算法
  7. 详解MySQL 内连接、外连接、左连接、右连接
  8. Jenkins持续集成企业实战
  9. [转帖]分享Oracle的四道经典面试题,值得收藏
  10. ota编译及差分包制作