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实现微信支付的更多相关文章

  1. Java 后端微信支付demo

    Java 后端微信支付demo 一.导入微信SDK 二.在微信商户平台下载证书放在项目的resources目录下的cert文件夹下(cert文件夹需要自己建) 三.实现微信的WXPayConfig接口 ...

  2. JAVA实现微信支付V3

    喜欢的朋友可以关注下,粉丝也缺. 相信很多的码友在项目中都需要接入微信支付,虽说微信支付已成为一个普遍的现象,但是接入的过程中难免会遇到各种各样的坑,这一点支付宝的SDK就做的很好,已经完成的都知道了 ...

  3. JAVA开发微信支付-公众号支付/微信浏览器支付(JSAPI)

    写这篇文章的目的有2个,一是自己的项目刚开发完微信支付功能,趁热回个炉温习一下,二也是帮助像我这样对微信支付不熟悉,反复看了多天文档还是一知半解,原理都没摸清,更不要说实现了.本以为网上的微信开发教程 ...

  4. java对接微信支付

    对接微信扫码支付(模式2),前端使用velocity技术 (1)调用微信支付接口(view层)  此部分业务逻辑部分可以省略 @RequestMapping("/wxpay.htm" ...

  5. java做微信支付notify_url异步通知服务端的写法

    最近团队在接入微信支付,APP和JSAPI的接口都需要填写一个notify_url回调地址,但是坑爹的官方文档并没有找到JSAPI模式的java版的demo,所以不得不自己看文档写了一个接受微信异步通 ...

  6. java版微信支付/查询/撤销

    最近公司接入微信刷卡支付,网上根本没见到很直接的教程(可能眼拙),一直摸滚打爬,加班加点才走通,忍不了必须写一写 微信 刷卡支付/查询/撤销... 必须要有公众号然后去申请,申请自己去看文档,这里主要 ...

  7. Java之微信支付(扫码支付模式二)案例实战

    摘要:最近的一个项目中涉及到了支付业务,其中用到了微信支付和支付宝支付,在做的过程中也遇到些问题,所以现在总结梳理一下,分享给有需要的人,也为自己以后回顾留个思路. 一:微信支付接入准备工作: 首先, ...

  8. java实现微信支付之扫码支付

    本文直接从代码调用微信扫码支付讲起.账号配置,参数生成等请参考官方文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1 微信 ...

  9. java之微信支付通知

    微信支付,是现在大多数平台都需要接入的一个支付方式,没办法,谁让现在的用户都习惯了这种消费方式呢 我今天只说说微信支付通知,我们后台怎么接收通知,并把我们的订单的状态改为已支付, 至于为什么不说支付的 ...

随机推荐

  1. 20145232 韩文浩 《Java程序设计》第6周学习总结

    教材学习内容总结 Java是以串流(Stream)的方式来处理输入与输出. 串流是一种抽象观念,从键盘输入资料,将处理结果输入档案,以及读取档案的内容等动作皆视为串流的处理. 输入串流代表对象为jav ...

  2. 第75讲:模式匹配下的For循环

    今天学习了模式匹配下的for循环内容.让我们从代码实战角度出发. for(i<-List(1,2,3,4,5)) println(i)//实际上调用的是foreach        for(in ...

  3. idea2018.2.4的安装激活与热部署插件JRebel的激活方法

    去Idea的官网下载如上版本的Idea安装文件 并且在网上搜索下载如下破解工具 放置在相应的Idea安装目录下 然后在Idea中输入激活码 { "licenseId": " ...

  4. 13.2.DataGrid增、删、改、查后台实现

    一.UserServlet: 二:Dao接口: 三:Dao接口的实现类:

  5. hive sql 查询一张表的数据不在另一张表中

    有时,我们需要对比两张表的数据,找到在其中一张表,不在另一张表中的数据 hql 如下: SELECT * FROM (SELECT id FROM a WHERE dt = '2019-03-17' ...

  6. SVN代码管理发布

    1.svn的独立模式应用 2.svn钩子的应用(例如:代码提交前的文件格式限制,大小限制,代码发布svn成功后的备份等等) 3.大型企业的代码发布流程 有一些制度流程.逻辑方案 4.业务变更管理

  7. Android-Could not find method implementation() for arguments

    当AndroidStudio加载工程的时候:报以下错误: 详细错误: Could not find method implementation() for arguments [file collec ...

  8. Canvas教程

    一.Canvas基本用法 canvas对应中文是“画布”,<canvas>是HTML5的新元素,IE9+支持 canvas元素的默认大小是300px * 150px,最简单的代码将生成一个 ...

  9. C#生成指定长度随机数

    public static string GetRandomString(int iLength) { ";// 随机字符中也可以为汉字(任何) StringBuilder sb = new ...

  10. 【js】关于正则表达式

    正则表达式描述了字符的模式对象 语法: var patt=new RegExp(pattern,modifiers); 或更简单的方法 var patt=/pattern/modifiers; 模式描 ...