Java调用微信支付代码
核心需求:用户点击按钮,生成一个二维码,微信扫码之后支付成功。要调用微信的接口,首先你需要引入微信支付的jar包,如下:
- 引入微信支付的jar包
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
2.开发工具类:
package com.example.ffmpeg;import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import com.github.wxpay.sdk.WXPay;public class WXService {private static Logger logger = LoggerFactory.getLogger(WXService.class);private WXPay wxpay;private WXPayConfigImpl config;private static WXService INSTANCE; private WXService() throws Exception {config = WXPayConfigImpl.getInstance();wxpay = new WXPay(config);}public static WXService getInstance() throws Exception {if (INSTANCE == null) {synchronized (WXPayConfigImpl.class) {if (INSTANCE == null) {INSTANCE = new WXService();}}}return INSTANCE;}
3.下单接口:/*** * * @param out_trade_no* @param body* @param money* @param applyNo* @return*/public String doUnifiedOrder(String out_trade_no, String body, Double money, String applyNo) {String amt = String.valueOf(money * 100);HashMap<String, String> data = new HashMap<String, String>();data.put("body", body);data.put("out_trade_no", out_trade_no);data.put("device_info", "web");data.put("fee_type", "CNY");data.put("total_fee", amt.substring(0, amt.lastIndexOf(".")));data.put("spbill_create_ip", config.getSpbillCreateIp());data.put("notify_url", config.getNotifUrl());data.put("trade_type", config.getTradeType());data.put("product_id", applyNo);System.out.println(String.valueOf(money * 100));// data.put("time_expire", "20170112104120");try {Map<String, String> r = wxpay.unifiedOrder(data);logger.info("返回的参数是" + r);return r.get("code_url");} catch (Exception e) {e.printStackTrace();logger.info(e.getMessage());return null;}}
4. 退款接口:public void doRefund(String out_trade_no, String total_fee) {logger.info("退款时的订单号为:" + out_trade_no + "退款时的金额为:" + total_fee);String amt = String.valueOf(Double.parseDouble(total_fee) * 100);logger.info("修正后的金额为:" + amt);logger.info("最终的金额为:" + amt.substring(0, amt.lastIndexOf(".")));HashMap<String, String> data = new HashMap<String, String>();data.put("out_trade_no", out_trade_no);data.put("out_refund_no", out_trade_no);data.put("total_fee", amt.substring(0, amt.lastIndexOf(".")));data.put("refund_fee", amt.substring(0, amt.lastIndexOf(".")));data.put("refund_fee_type", "CNY");data.put("op_user_id", config.getMchID());try {Map<String, String> r = wxpay.refund(data);logger.info("退款操作返回的参数为" + r);} catch (Exception e) {e.printStackTrace();}}
4. 验证接口:/*** * @param out_trade_no* @param body* @param money* @param applyNo* @return* @throws DocumentException */public boolean checkSign(String strXML) throws DocumentException {SortedMap<String, String> smap = new TreeMap<String, String>();Document doc = DocumentHelper.parseText(strXML);Element root = doc.getRootElement();for (Iterator iterator = root.elementIterator(); iterator.hasNext();) {Element e = (Element) iterator.next();smap.put(e.getName(), e.getText());}return isWechatSign(smap,config.getKey());}private boolean isWechatSign(SortedMap<String, String> smap,String apiKey) {StringBuffer sb = new StringBuffer();Set<Entry<String, String>> es = smap.entrySet();Iterator<Entry<String, String>> it = es.iterator();while (it.hasNext()) {Entry<String, String> entry = it.next();String k = (String) entry.getKey();String v = (String) entry.getValue();if (!"sign".equals(k) && null != v && !"".equals(v) && !"key".equals(k)) {sb.append(k + "=" + v + "&");}}sb.append("key=" + apiKey);/** 验证的签名 */String sign = MD5Util.MD5Encode(sb.toString(), "utf-8").toUpperCase();/** 微信端返回的合法签名 */String validSign = ((String) smap.get("sign")).toUpperCase();return validSign.equals(sign);}
}
4. 配置类:package com.example.ffmpeg;import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;import com.github.wxpay.sdk.WXPayConfig;public class WXPayConfigImpl implements WXPayConfig{private byte[] certData;private static WXPayConfigImpl INSTANCE;private WXPayConfigImpl() throws Exception{String certPath = "F:\\weixin\\apiclient_cert.p12";File file = new File(certPath);InputStream certStream = new FileInputStream(file);this.certData = new byte[(int) file.length()];certStream.read(this.certData);certStream.close();}public static WXPayConfigImpl getInstance() throws Exception{if (INSTANCE == null) {synchronized (WXPayConfigImpl.class) {if (INSTANCE == null) {INSTANCE = new WXPayConfigImpl();}}}return INSTANCE;}public String getAppID() {return "你的appid";}public String getMchID() {return "你的商户id";}public String getKey() {return "你设置的key值";}public String getNotifUrl() {return "微信通知回调的url接口";}public String getTradeType() {return "NATIVE";}public InputStream getCertStream() {ByteArrayInputStream certBis;certBis = new ByteArrayInputStream(this.certData);return certBis;}public int getHttpConnectTimeoutMs() {return 2000;}public int getHttpReadTimeoutMs() {return 10000;}// IWXPayDomain getWXPayDomain() {
// return WXPayDomainSimpleImpl.instance();
// }public String getPrimaryDomain() {return "api.mch.weixin.qq.com";}public String getAlternateDomain() {return "api2.mch.weixin.qq.com";}public int getReportWorkerNum() {return 1;}public int getReportBatchSize() {return 2;}public String getSpbillCreateIp() {// TODO Auto-generated method stubreturn "192.168.1.1";}
}
4. 配置类:
apiclient_cert.p12的证书文件。这个证书文件你可以登录微信的商户平台。在这里去下载你所需要的证书。WXPayConfigImpl 在构造方法里面去读取这个文件,所以构造方法抛了异常。因为构造器抛出异常,所以这里没有采用静态内部类而是采用双检锁的方式去实现单例。回到WXService这个类中,代码往下走,在WXService的构造器中对config和wxpay进行了实例化。接下来同样是用双检锁的方式实现的单例。往下走,微信的下单接口,分别传入out_trade_no(外部订单号),body(商品描述), money(付款金额), applyNo(对应微信的product_id:商品id,由商户自定义)四个参数。进入方法后第一句话String amt = String.valueOf(money * 100);是把传入的钱数乘以100,并转换成字符串。这里之所以乘以100是因为微信那边会把我们传过去的钱数除以100得到应付金额,且不能传小数,所以下面的那一句amt.substring(0, amt.lastIndexOf(“.”))就是为了把金额中的小数点去掉。往下走,new出了一个hashmap,将参数传入hashmap中,然后调用wxpay.unifiedOrder(data);下单接口下单。得到返回的map集合,从map中获得的code_url这个参数就是微信返回给我们生成二维码的字符串。这样,下单的整个流程就跑通了,现在写个测试类来测试一下。package com.example.ffmpeg;public class MyTest {public static void main(String[] args) throws Exception {WXService wx = WXService.getInstance();String QRcode = wx.doUnifiedOrder("test001", "测试下单接口", 0.01, "a123456");System.out.println("得到的二维码是:"+QRcode);}
}
Java调用微信支付代码相关推荐
- java调用微信支付流程
1 注册微信开发者账号,获取相应密钥 2 创建内网穿透,这个要接收微信返回的支付状态二维码等. 3 导入需要到jar包和配置类(在官网文档复制即可) 4 在配置类填入自己开发者账号信息,以及你接收微信 ...
- 微信小程序获取用户手机号码,Java后台servlet解密(微信小程序调用微信支付也是大致的流程)
本篇记录说明 微信小程序获取用户手机号码,Java后台servlet解密(微信小程序调用微信支付也是大致的流程,详细内容可私信交流) (第一次写博客,写得不好的地方见谅,面向新手,大佬请无视,不喜勿喷 ...
- 微信公众号页面支付接口java,[Java教程]微信公众号支付(三):页面调用微信支付JS并完成支付...
[Java教程]微信公众号支付(三):页面调用微信支付JS并完成支付 0 2015-09-15 15:00:30 一.调用微信的JS文件 1.首先要绑定[JS接口安全域名],"公众号设置&q ...
- java微信支付代码_10行代码搞定微信支付(Java版)
原标题:10行代码搞定微信支付(Java版) 微信支付痛点 对于大多数同学来说,要开发微信支付可不简单.附上微信支付官方文档网页链接 从文档上可以看出,你需要解决很多问题,我就随便挑几个吧. xml与 ...
- 【Java 实现微信支付、Native 支付流程】,从编写代码到支付成功,一步到位!
文章目录 1. 项目环境介绍 2. 微信支付文档 2.1 业务流程说明 3. 准备信息 3.1 微信公众账号如何获取? 3.2 商户号如何获取? 3.3 API密钥如何获取? 3.4 准备工具类 4. ...
- Java接入微信支付ApiV3详细教程
1.申请商户API证书 APIv2 中,调用微信支付安全级别较高的接口(如:退款.企业红包.企业付款) APIv3 中,调用微信支付所有接口 2.商户申请商户API证书时,会生成商户私钥,并保存在本地 ...
- 微信小程序-JAVA实现微信支付功能(微信支付2.0)
微信小程序-JAVA实现微信支付功能(微信支付2.0) 一.前言 本博客主要介绍JAVA后台与微信小程序(UNI-APP或者原生微信小程序)的微信支付的实现,如果是APP或者H5的开发暂时不支持,具体 ...
- Java对接微信支付(完整全流程)
Java对接微信支付及支付回调通知的全流程 一.所用框架.对接微信支付我们技术组用的是payment框架,因为该框架已整合springboot因此很方便快捷 <dependency>< ...
- java实现微信支付与支付宝支付接口
因为公司要求需要写支付宝支付与微信支付现在写完了,总结一下: 支付宝支付: 支付宝支付比较简单首先我说一下支付宝支付与微信支付大概的流程,就拿支付宝支付来说(微信同理) 首先去蚂蚁金服注册一下App ...
- Java之微信支付(扫码支付模式二)案例实战
摘要:最近的一个项目中涉及到了支付业务,其中用到了微信支付和支付宝支付,在做的过程中也遇到些问题,所以现在总结梳理一下,分享给有需要的人,也为自己以后回顾留个思路. 一:微信支付接入准备工作: 首先, ...
最新文章
- 2021年大数据Kafka(四):❤️kafka的shell命令使用❤️
- 5-struts2知识补充(	常用的struts2的标签,数据回显,防止重复提交)
- 并查集求欧拉回路/通路
- dos, echo写文件不追加回车的方法
- 阿里员工:只有两百万现金和一套房,这样干着没意思
- 微信小程序——通过百度API查询天气情况
- DOS命令大全:MS-DOS命令详解
- 3dB带宽的简要解释
- 转 为什么数码相机可以拍出彩色照片?
- 傲游浏览器 页面广告过滤 自定义 过滤规则 及使用方法 不定时更新
- correl函数相关系数大小意义_相关系数越大,说明两个变量之间的关系就越强吗...
- 自我认知测试软件,自我认知-MBTI测试
- 【转载】Jupyter Lab中的plot.ly离线模式不显示图
- 利用计算机引号作用,计算机双引号怎么打出来
- 【C语言】!!是什么意思?
- python.plt 画三维图像
- java字节字符_java中字符和字节的区别
- Java11.2个人通讯录_Java嵌入式数据库LMini-0.1.2及其通讯录使用示例发布
- SQL Server 数据分组
- 怎么在网上找计算机答案,试卷上怎么啊