java实现微信支付
java实现微信支付
package com.hk.wx.pay.service.impl; @Service
public class PayServiceImpl
implements PayService
{
private static final Logger LOG = LoggerFactory.getLogger(PayServiceImpl.class);
private static final String PAY_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder"; @Value("${appid}")
private String APPID = ""; @Value("${pay.mch_id}")
private String PAY_MACH_ID = ""; @Value("${pay.body}")
private String PAY_BODY = ""; @Value("${pay.notify_url}")
private String PAY_NOTIFY_URL = ""; @Value("${pay.trade_type}")
private String PAY_TYPR = ""; @Value("${pay.key}")
private String PAY_KEY = ""; public JSONObject wxPay(String total_fee, String imei, String ip, String openid)
{
Map pay = new LinkedHashMap(); // 按照 添加顺序 排序 pay.put("appid", this.APPID); //小程序 aapid
pay.put("attach", getOrderNum()); //附加数据
pay.put("body", this.PAY_BODY); //商品描述
pay.put("device_info", imei); //
pay.put("mch_id", this.PAY_MACH_ID); //商品号
pay.put("nonce_str", getNonceStr()); //随机字符串
pay.put("notify_url", this.PAY_NOTIFY_URL); //返回连接
pay.put("openid", openid); //微信用户 id
pay.put("out_trade_no", getOrderNum()); //订单号
pay.put("sign_type", "MD5");
pay.put("spbill_create_ip", ip);
pay.put("total_fee", total_fee);
pay.put("trade_type", this.PAY_TYPR);
pay.put("sign", getSign(pay)); String xml = XmlUtil.mapToXMLString(pay); // 转成 xml 形式
System.out.println(xml);
String msg = "";
try
{
msg = HttpUtils.xmlRequest("https://api.mch.weixin.qq.com/pay/unifiedorder", "POST", xml); // xml 形式 post请求
JSONObject json = XmlUtil.xmlToJSONObject(msg);
String ret = json.getString("return_code"); if ((ret != "") && (ret.equals("SUCCESS")) &&
(!"SUCCESS".equals(json.getString("result_code")))) {
return json;
} LOG.info("# 统一下单错误...msg:" + json.toString()); return null;
}
catch (Exception e) {
LOG.error("# 支付出错...");
e.printStackTrace();
}return null;
}
//获取随机数
private static String getNonceStr()
{
return Md5Utils.encryption(ComApi.getUUID());
}
//获取 sign
private static String getSign(Map<Object, Object> parameters)
{
String characterEncoding = "UTF-8";
StringBuffer sb = new StringBuffer(); List list = new ArrayList(parameters.entrySet()); Collections.sort(list, new Comparator() {
public int compare(Map.Entry<Object, Object> mapping1, Map.Entry<Object, Object> mapping2) {
return ((String)mapping1.getKey()).compareTo((String)mapping2.getKey());
}
});
for (Map.Entry mapping : list) {
String k = (String)mapping.getKey();
Object v = mapping.getValue();
if ((v != null) && (!"".equals(v)) && (!"sign".equals(k)) && (!"key".equals(k))) {
sb.append(k + "=" + v + "&");
} } sb.append("key=key"); //key 是支付帐号里面的api安全密码
LOG.info("# sign 拼接:" + sb.toString());
String sign = Md5Utils.encryption(sb.toString(), characterEncoding).toUpperCase();
LOG.info("# 获取 签名...sign:" + sign);
return sign;
}
//获取订货号
private static String getOrderNum()
{
String time = TimeUtils.getSysDate("yyyyMMddHHmmssSSS");
String uuNum = ComApi.getUUNum();
String num = "HK" + time + uuNum;
return num;
} }
java实现微信支付的更多相关文章
- Java 后端微信支付demo
Java 后端微信支付demo 一.导入微信SDK 二.在微信商户平台下载证书放在项目的resources目录下的cert文件夹下(cert文件夹需要自己建) 三.实现微信的WXPayConfig接口 ...
- JAVA实现微信支付V3
喜欢的朋友可以关注下,粉丝也缺. 相信很多的码友在项目中都需要接入微信支付,虽说微信支付已成为一个普遍的现象,但是接入的过程中难免会遇到各种各样的坑,这一点支付宝的SDK就做的很好,已经完成的都知道了 ...
- JAVA开发微信支付-公众号支付/微信浏览器支付(JSAPI)
写这篇文章的目的有2个,一是自己的项目刚开发完微信支付功能,趁热回个炉温习一下,二也是帮助像我这样对微信支付不熟悉,反复看了多天文档还是一知半解,原理都没摸清,更不要说实现了.本以为网上的微信开发教程 ...
- java对接微信支付
对接微信扫码支付(模式2),前端使用velocity技术 (1)调用微信支付接口(view层) 此部分业务逻辑部分可以省略 @RequestMapping("/wxpay.htm" ...
- java做微信支付notify_url异步通知服务端的写法
最近团队在接入微信支付,APP和JSAPI的接口都需要填写一个notify_url回调地址,但是坑爹的官方文档并没有找到JSAPI模式的java版的demo,所以不得不自己看文档写了一个接受微信异步通 ...
- java版微信支付/查询/撤销
最近公司接入微信刷卡支付,网上根本没见到很直接的教程(可能眼拙),一直摸滚打爬,加班加点才走通,忍不了必须写一写 微信 刷卡支付/查询/撤销... 必须要有公众号然后去申请,申请自己去看文档,这里主要 ...
- Java之微信支付(扫码支付模式二)案例实战
摘要:最近的一个项目中涉及到了支付业务,其中用到了微信支付和支付宝支付,在做的过程中也遇到些问题,所以现在总结梳理一下,分享给有需要的人,也为自己以后回顾留个思路. 一:微信支付接入准备工作: 首先, ...
- java实现微信支付之扫码支付
本文直接从代码调用微信扫码支付讲起.账号配置,参数生成等请参考官方文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1 微信 ...
- java之微信支付通知
微信支付,是现在大多数平台都需要接入的一个支付方式,没办法,谁让现在的用户都习惯了这种消费方式呢 我今天只说说微信支付通知,我们后台怎么接收通知,并把我们的订单的状态改为已支付, 至于为什么不说支付的 ...
随机推荐
- activeMq之hello(java)
消息队列activeMq, 节省响应时间,解决了第三方响应时间长的问题让其他客户可以继续访问, 安装activeMq apache-activemq-5.14.0-bin\apache-activ ...
- java基础-day18
第07天 集合 今日内容介绍 u HashSet集合 u HashMap集合 第1章 HashSet集合 1.1 Set接口的特点 Set体系的集合: A:存入集合的顺序和取出集合的顺序不一 ...
- [代码优化]PHP代码优化
// Code snippet 1 $u_id = Hnb_Session::getInstance()->getUserID(); $arr_joinedTribeInfo = array() ...
- [HTML5]如何使用移动设备的方向定位器
HTML5 Rocks Show navigation Table of Contents Home Tutorials Updates Table of Contents Introduction ...
- iOS_URI跳转方式多种地图导航的代码实践
先来看一下我们要达到什么效果,就是当我们点导航的时候,会弹出下面这个选择列表. 当然,如果没有安装某个地图APP,那么对应的选项是不会出现的.检测APP是否安装,只要调用下面这个方法就可以了 [[UI ...
- postgresql 主从 patroni
1 安装基础包 1.1 postgres yum install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_ ...
- .NET 中的 GAC
GAC : ———> 全局程序集缓存 介绍GAC的好文章(怎么:生成SNK,给项目加强名称,加入到GAC,多个版本共存,介绍了不同的工具): http://www.makaidong.com/% ...
- ionic 2.x 3.x input触发调用键盘搜索及事件
html (1.input type='search' 2.将input套在一个带action的form中 ) <form action=""> <ion- ...
- Redis---基础数据结构
1.String(字符串) 1.1 概述 字符串 string 是 Redis 最简单的数据结构.Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应 ...
- Java - 基础起步
package basics; //声明该类所在的包为basics,package为包的关键字 import java.util.Date; //导入java.util包中的Date类,用来封装当前的 ...