java进行微信h5支付开发
最近在做微信支付开发用的框架是 srpingMVC mybatis spring
下面是开发流程图
我们只需要开发红色标记的模块就可以了。
具体参数详情可以查看微信开发者文档。
新手第一次写,写的不好。
1.下面是下单接口
@RequestMapping(value = "/down/order.spr")
@ResponseBody
public Object downOrder(HttpServletRequest request, HttpServletResponse response,
@RequestParam("appointment_id") String appointment_id) {
// 生成随机数字符串
String nonceStr = getRandomString();
// 获取商品订单号
String out_trade_no = UUID.randomUUID().toString().replace("-", "");
// 获取终端 IP
String spbill_create_ip = request.getRemoteAddr();
// 获取微信 openid
WeiXinUserInfo userInfo = (WeiXinUserInfo) request.getSession().getAttribute("weixinUser");
// 组装请求数据
Map<String, String> paramsMap = new HashMap<String, String>();
// 获取签名
String sign = "";
try {
paramsMap.put("openid", userInfo.getOpenid());
paramsMap.put("appid", APP_ID);
paramsMap.put("mch_id", MCH_ID);
paramsMap.put("nonce_str", nonceStr);
paramsMap.put("body", body);
paramsMap.put("out_trade_no", out_trade_no);
paramsMap.put("fee_type", FEE_TYPE);
paramsMap.put("total_fee", total_fee);
paramsMap.put("spbill_create_ip", spbill_create_ip);
paramsMap.put("notify_url", NOTIFY_URL);
paramsMap.put("trade_type", TRADE_TYPE);
sign = getPayCustomSign(paramsMap, paykey);
paramsMap.put("sign", sign);
} catch (Exception e) {
log.debug("生成请求签名失败");
}
// map 转 xml 字符串
String paramsXml = mapToXml(paramsMap);
// 发送订单请求
String result = sendPost(DOWN_ORDER, paramsXml);
// 将返回的 xml 转化成 map
Map<String, String> resultMap = null;
// 获取预支付交易会话标识
String prepay_id = "";
if (result.indexOf("SUCCESS") != -1) {
try {
resultMap = xmlToMap(result);
prepay_id = resultMap.get("prepay_id");
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 进行填充数据库
saveOrder(appointment_id);
}
// 封装 h5 页面调用参数
Map<String, Object> returnSignMap = new HashMap<String, Object>();
String returnSign = "";
try {
returnSignMap.put("appid", APP_ID);
returnSignMap.put("timeStamp", System.currentTimeMillis());
returnSignMap.put("nonce_str", nonceStr);
returnSignMap.put("package", "prepay_id=" + prepay_id);
returnSignMap.put("signType", "MD5");
returnSign = getPayCustomSign(returnSignMap, paykey);
returnSignMap.put("sign", returnSign);
} catch (Exception e) {
log.debug("生成返回签名失败");
}
return new ResponseWrapper(ExceptionCode.SUCCESS, null, returnSignMap);
}
比较麻烦是签名的获取:以下是代码(摘自网络)
/**
* 获取支付所需签名
*
* @param bizObj
* @param key
* @return
* @throws Exception
*/
private String getPayCustomSign(Map map, String key) throws Exception {
String bizString = FormatBizQueryParaMap(map, false);
return sign(bizString, key);
}
/**
* 进行字典排序
*
* @param paraMap
* @param urlencode
* @return
* @throws Exception
*/
private String FormatBizQueryParaMap(Map paraMap, boolean urlencode) throws Exception {
String sf = "";
try {
List<Entry> infoIds = new ArrayList<Entry>(paraMap.entrySet());
Collections.sort(infoIds, new Comparator<Entry>() {
public int compare(Map.Entry o1, Map.Entry o2) {
return (o1.getKey().toString().compareTo(o2.getKey().toString()));
}
});
for (int i = 0; i < infoIds.size(); i++) {
Map.Entry entryItem = infoIds.get(i);
if (entryItem.getKey() != "") {
String key = (String) entryItem.getKey();
String value = (String) entryItem.getValue();
if (urlencode) {
value = URLEncoder.encode(value, "utf-8");
}
sf += key + "=" + value + "&";
}
}
if (sf.isEmpty() == false) {
sf = sf.substring(0, sf.length() - 1);
}
} catch (Exception e) {
throw new Exception(e.getMessage());
}
return sf;
}
/**
* 生成 签名
*
* @param content
* @param key
* @return
*/
private String sign(String content, String key) {
String signStr = content + "&key=" + key;
return MD5(signStr).toUpperCase();
}
/**
* MD5 加密
*
* @param str
* @return
*/
private final String MD5(String str) {
char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
try {
byte[] btInput = str.getBytes();
MessageDigest mdInst = MessageDigest.getInstance("MD5");
mdInst.update(btInput);
byte[] md = mdInst.digest();
int j = md.length;
char str2[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str2[k++] = hexDigits[byte0 >>> 4 & 0xf];
str2[k++] = hexDigits[byte0 & 0xf];
}
return new String(str2);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
生成随机数
/**
* 随机生成 32 位的字符串
*
* @return
*/
private String getRandomString() {
Random random = new Random();
StringBuffer nonceStrSf = new StringBuffer();
for (int i = 0; i < 32; i++) {
nonceStrSf.append(nonce_str.charAt(random.nextInt(nonce_str.length() - 1)));
}
return nonceStrSf.toString();
}
map转xml
/**
* map 转 xml
*
* @param map
* @return
*/
private String mapToXml(Map<String, String> map) {
StringBuffer sf = new StringBuffer("<xml>");
Iterator<Entry<String, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Entry<String, String> entry = iterator.next();
String key = entry.getKey();
String value = entry.getValue();
sf.append("<" + key + ">" + value + "</" + key + ">");
}
sf.append("</xml>");
return sf.toString();
}
2.接受微信通知结果接口
/**
* 接受通知
*
* @param request
* @param response
* @return
* @throws IOException
*/
@RequestMapping(value = "/acceptance/notify.spt")
public void acceptanceNotify(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 接受微信返回通知
String content = RequestUtil.getRequestContent(request);
// 设置发送请求参数
Map<String, String> resultMap = new HashMap<String, String>();
try {
resultMap = xmlToMap(content);
} catch (JDOMException e) {
e.printStackTrace();
}
// 进行数据存库,交易成功则存库,否则不存
saveOrderLog(content, resultMap);
Map<String, String> returnMap = new HashMap<String, String>();
returnMap.put("return_code", resultMap.get("return_code"));
returnMap.put("return_msg", resultMap.get("return_msg"));
String toXml = mapToXml(returnMap);
response.getWriter().write(toXml);
}
第一次写这么长的博客,不足之处请留言告之便于本人成长,再次感谢你的阅读。
java进行微信h5支付开发的更多相关文章
- java实现微信H5支付
前面做了app微信支付的回调处理,现在需要做微信公众号的支付,花了一天多时间,终于折腾出来了!鉴于坑爹的微信官方没有提供Java版的demo,所以全靠自己按照同样坑爹的文档敲敲敲,所以记录下来,以供自 ...
- PHP微信H5支付开发
近来公司项目要求用到微信H5开发,因为微信开发文档处处都是坑,我也走了不少弯路,现在就把H5支付的过程记录一下,已备后用!! 首先 先去商户平台申请开通 H5支付!!!! 我们从微信官方下载H5支付d ...
- 微信H5支付开发(maven仓库版)
官方文档:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_1 开发之前确认开通了H5支付功能 一.安装微信sdk 二.创建config ...
- 微信H5支付(基于Java实现微信H5支付)
微信的H5支付区别与APP支付,主要在于预下单(返回的参数不一样),其它大体相同(基本没什么区别,区别在于有些人加密喜欢用MD5有些人喜欢用官方提供的加密方式加密,我用的是官方的),贴一下H5支付预下 ...
- 微信H5支付开发步骤总结
* 开发步骤: * 1.在微信公众号平台设置授权目录,即jsapi.php所在的目录 * 2.在微信支付平台下载证书,放到cert目录 * 3.在微信支付平台设置API秘钥,同时在WxPay.Conf ...
- 微信H5支付开发全过程(除内置微信以外的浏览器)
前言:网上都是~ 呵呵 自己搞 只要花时间 多问客服总会有的 只说程序不说准备工作 自己ID 或者秘钥都准备好了 写的有点儿乱 可以把所有的方法 放在一个文件中调用 public function ...
- Android通过外部浏览器调用微信H5支付,Android+PHP详解
看了好多关于讲解微信H5支付开发的文章,大多数都是通过微信内部浏览器来调用支付接口(其实就是公众号支付),可能是因为H5支付接口刚开放不久吧. 微信官方体验链接:http://wxpay.wxutil ...
- 微信支付之微信H5支付(坑,ajax不支持重定向跳转)
这里讲的是 微信h5支付, 是微信以外的手机浏览器调用微信h5支付 h5支付: H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起 ...
- C#开发微信门户及应用(44)--微信H5页面开发的经验总结
在我们开发微信页面的时候,需要大量用到了各种呈现的效果,一般可以使用Boostrap的效果来设计不同的页面,不过微信团队也提供很多这方面的资源,包括JSSDK的接口,以及Weui的页面样式和相关功能页 ...
随机推荐
- 管理员技术(三): 配置静态网络地址、 使用yum软件源 、 升级Linux内核、查找并处理文件、查找并提取文件内容
一. 配置静态网络地址 目标: 本例要求为虚拟机 server 配置以下静态地址参数: 1> 主机名:server0.example.com 2> IP地址:172.25.0.11 ...
- [NOIP模拟13]题解
A.矩阵游戏 其实挺水的? 考场上根本没有管出题人的疯狂暗示(诶这出题人有毛病吧这么简单的东西写一大堆柿子),而且推公式能力近乎没有,所以死掉了. 很显然乘法有交换率结合率所以操作顺序对最终结果没什么 ...
- wmic命令用法小例
wmic就是wmic.exe,位于windows目录底下,是一个命令行程序.WMIC可以以两种模式执行:交互模式(Interactive mode)和非交互模式(Non-Interactive mod ...
- windows server2012r2 安装NET Framework 3.5
在Windows Server 2012上安装一些软件,比如Oracle 11g等,经常会出现下面这样的错误:“无法安装一下功能:.NET Framework 3.5(包括.NET 2.0和3.0)” ...
- Linux知识总结(更新中)
Linux知识总结(更新中) 如何查找特定的文件 find find path [options] params 作用:在指定目录下查找文件 检索文件内容 grep grep [options] pa ...
- python_way ,day22 tonardo,jsonp
python_way day22 1.tonardo 2.cookie 3.api认证 一.tonardo: a.tonardo 初识 #!/usr/bin/env python3# Created ...
- POJ 2451 Uyuw's Concert (半平面交)
题目链接:POJ 2451 Problem Description Prince Remmarguts solved the CHESS puzzle successfully. As an awar ...
- 拾遗:Go 单元测试
概念 回归测试:是指修改了旧代码之后,重新进行测试,以确保修改没有引入新的错误或导致其它代码产生错误: 单元测试:是指对软件中的最小可测试单元(单个函数或类)进行检查和验证 Test-Driven D ...
- 快速列出大纲.提纲.归纳知识点 思维导图工具Xmind
博客搬迁,给您带来的不便敬请谅解! http://www.suanliutudousi.com/2017/10/23/%E5%BF%AB%E9%80%9F%E5%88%97%E5%87%BA%E5%A ...
- redis主从复制和哨兵
摘自:https://www.cnblogs.com/leeSmall/p/8398401.html 一.Redis主从复制 主从复制:主节点负责写数据,从节点负责读数据,主节点定期把数据同步到从节点 ...