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. Libre Office冻结操作-MAC

    冻结行/列 选中所要冻结的行/列,选择window-Freeze 冻结成功 冻结单元格 操作方法与“冻结行/列”一致

  2. Beta阶段第三篇Scrum冲刺博客-Day2

    1.站立式会议 提供当天站立式会议照片一张 2.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 张晨晨:熟悉代码 郭琪容:了解复习模块需要的部分知识 ...

  3. java注解学习(1)注解的作用和三个常用java内置注解

    今天,记录一下自己学习的关于注解方面的知识. Annotation是从JDK5.0开始引入的新技术 Annotation的作用: -不是程序本身,可以对程序做出解释(这一点和注释没什么区别) -可以被 ...

  4. myeclipse6.6+maven跑springside4.1的demo

    1.安装myeclipse6.6 2.myeclipse6.6安装maven 2.1 删除原有maven. 关闭Eclipse程序, 进入MyEclipse插件目录/eclipse/features ...

  5. AngularJS 路由及SPA理解

    一.路由及SPA理解 路由允许我们通过不同的 URL 访问不同的内容,可实现多视图的单页web应用(SPA);通常我们的URL形式为 http://runoob.com/first/page,但在单页 ...

  6. 【抄袭】VB.NET扩展WebBrowser,拥有跳转前获取URL的能力

    来自 http://www.cnblogs.com/yuanjw/archive/2009/02/09/1386789.html 我仅做VB化,并优化了事件消息 Imports System.Comp ...

  7. UWP 使用Windows Community Toolkit 的OneDrive service上传下载文件

    上一年年底写过两篇文章 UWP 使用OneDrive云存储2.x api(一)[全网首发] UWP 使用OneDrive云存储2.x api(二)[全网首发] 没想到半年之后,VS编译提示方法已经过时 ...

  8. [leetcode.com]算法题目 - Gray Code

    The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...

  9. Linux系统VIM编辑器管理(2)

    VI/VIM模式概述 在 Linux 的世界中,绝大部分的配置文件都是以 ASCII 的纯文本形态存在,因此利用简单的文字编辑软件就能够修改设定了,与微软的 Windows 系统不同的是,如果你用惯了 ...

  10. [CTSC2008]网络管理(整体二分+树剖+树状数组)

    一道经典的带修改树链第 \(k\) 大的问题. 我只想出三个 \(\log\) 的解法... 整体二分+树剖+树状数组. 那不是暴力随便踩的吗??? 不过跑得挺快的. \(Code\ Below:\) ...