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. (动态规划)Max Sum Plus Plus--hdu--1024

    http://acm.hdu.edu.cn/showproblem.php?pid=1024 Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Othe ...

  2. Codeforces821B Okabe and Banana Trees 2017-06-28 15:18 25人阅读 评论(0) 收藏

    B. Okabe and Banana Trees time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  3. MFC中处理UI界面时的注意点

    最近开发时,在处理界面上遇到了下面的问题: 上位机与下位机通信时,如果出现超时,弹出MessageBox提示的情况下,更新界面上的CStatic控件会出现重影. 经过调查发现 原因是由于在UI线程中处 ...

  4. 1.虚拟机中安装ubuntu

    1.VMware安装很简单,全部默认安装即可. 2.安装完VMware之后,打开VMware,点击创建虚拟机 典型安装易出问题,所以这里选择自定义安装 安装过程选项配置如下 处理器数,核数,内存都可以 ...

  5. 分形之闵可夫斯基(Minkowski)

    与上一篇文章分形之正方形折线相似,闵可夫斯基分形也是分形出正方体,不同之处是它分出了两个正方体. 核心代码: static void FractalMinkowski(const Vector3&am ...

  6. [翻译]第二天 - Visual Studio 中的 .NET Core 模版一览

    原文: http://michaelcrump.net/part2-aspnetcore/ 免责声明:我不是 .NET Core 开发团队的一员,并且使用的是公开.可用的工具. 简介 该系列文章的完整 ...

  7. NPOI 操作笔记

    public static class ExcelUtil { // Methods public static DataTable GetDataTable(Stream stream) { HSS ...

  8. Mac使用brew安装nginx,并解决端口访问权限问题

    1.安装 brew install nginx 2.修改配置文件 sudo vi /usr/local/etc/nginx/nginx.conf 修改默认的8080端口为80 修改日志文件地方 err ...

  9. Yii2 Apache + Nginx 路由重写

    一.什么是路由重写 原本的HTTP访问地址: www.test.com/index.php?r=post/view&id=100 表示这个请求将由PostController 的 action ...

  10. [JavaScript] iframe更改了src后,父页面history.back只能后退iframe而不能使自己后退解决办法

    浏览器的机制如此,在iframe导航变化后手动点击浏览器的后退按钮也依然只是后退iframe中的导航. 有一种解决方案是不要修改iframe.src,而是删除旧iframe元素,新建一个iframe元 ...