微信支付流程

都是我自己工作中开发的,亲测可用,不喜勿喷。

controller中我是这么写的,你们需要根据自己的业务需求改动。ResponseBean是我自己封装的,你们可以改成你们想要的形式。

/**

* 微信统一下单接口

* @return

*/

@RequestMapping(value = "/doUnifiedOrder", method = RequestMethod.POST)

public ResponseBean doUnifiedOrder(@RequestBody Map req) {

Map resultMap=new HashMap();

String openid = (String) req.get("openId");

WXPay wxpay =null;

try {

//初始化证书

myConfig.initCert();

wxpay= new WXPay(myConfig);

} catch (Exception e) {

e.printStackTrace();

}

//生成的随机字符串

String nonce_str = WXPayUtil.generateNonceStr();

//获取客户端的ip地址

//获取本机的ip地址

InetAddress addr = null;

try {

addr = InetAddress.getLocalHost();

} catch (UnknownHostException e) {

e.printStackTrace();

}

//支付金额,需要转成字符串类型,否则后面的签名会失败

String payOutMoney = WxMoney.changeY2F(String.valueOf(req.get("money")));

String tradeName = (String) req.get("tradeName");

if(tradeName!=null&&tradeName.length()>0){

}else{

tradeName = "课程支付";

}

String body = tradeName;

//商户订单号

String out_trade_no= WXPayUtil.generateNonceStr();

//统一下单接口参数

HashMap data = new HashMap();

data.put("appid", 你的appid);

data.put("mch_id", 商户id);

data.put("nonce_str", nonce_str);

data.put("body", body);

data.put("out_trade_no",out_trade_no);

data.put("total_fee", payOutMoney);

data.put("spbill_create_ip", "127.0.0.1");

data.put("notify_url", 回调地址);

data.put("trade_type","JSAPI");

data.put("openid", openid);

try {

Map rMap = wxpay.unifiedOrder(data);

String return_code = (String) rMap.get("return_code");

String result_code = (String) rMap.get("result_code");

String nonceStr = WXPayUtil.generateNonceStr();

resultMap.put("nonceStr", nonceStr);

Long timeStamp = System.currentTimeMillis() / 1000;

if ("SUCCESS".equals(return_code) && return_code.equals(result_code)) {

String prepayid = rMap.get("prepay_id");

resultMap.put("package", "prepay_id="+prepayid);

resultMap.put("signType", "MD5");

//这边要将返回的时间戳转化成字符串,不然小程序端调用wx.requestPayment方法会报签名错误

resultMap.put("timeStamp", timeStamp + "");

//再次签名,这个签名用于小程序端调用wx.requesetPayment方法

resultMap.put("appId",myConfig.getAppID());

String sign = WXPayUtil.generateSignature(resultMap, myConfig.getKey());

resultMap.put("paySign", sign);

resultMap.put("out_trade_no",out_trade_no);

ResponseBean responseBean = new ResponseBean(HttpStatus.OK.value(),"微信支付",resultMap);

return responseBean;

}else{

ResponseBean responseBean = new ResponseBean(HttpStatus.OK.value(),"微信支付失败","微信支付失败");

return responseBean;

}

} catch (Exception e) {

ResponseBean responseBean = new ResponseBean(HttpStatus.OK.value(),"微信支付失败","微信支付失败");

e.printStackTrace();

return responseBean;

}

}

微信退款代码(需要传退款的订单id)

public ResponseBean refund(Map req) {

Map resultMap=new HashMap();

String buyId = (String) req.get("buyId");

WXPay wxpay =null;

try {

myConfig.initCert();//初始化证书

wxpay= new WXPay(myConfig);

} catch (Exception e) {

e.printStackTrace();

}

//生成的随机字符串

String nonce_str = WXPayUtil.generateNonceStr();

//获取客户端的ip地址

//获取本机的ip地址

InetAddress addr = null;

try {

addr = InetAddress.getLocalHost();

} catch (UnknownHostException e) {

e.printStackTrace();

}

//支付金额,需要转成字符串类型,否则后面的签名会失败

// int total_fee= (int) req.get("money");

String payOutMoney = WxMoney.changeY2F(String.valueOf(req.get("money")));

// String body = (String) req.get("z");

//商户订单号

String out_trade_no= WXPayUtil.generateNonceStr();

//统一下单接口参数

HashMap data = new HashMap();

try {

data.put("appid", myConfig.getAppID());

data.put("mch_id", myConfig.getMchID());

data.put("nonce_str", nonce_str);

data.put("sign_type", "MD5");

data.put("out_trade_no",buyId);//微信订单号

data.put("out_refund_no", out_trade_no);//商户退款单号

data.put("total_fee",payOutMoney);//支付金额,微信支付提交的金额是不能带小数点的,且是以分为单位,这边需要转成字符串类型,否则后面的签名会失败

data.put("refund_fee",payOutMoney);//退款总金额,订单总金额,单位为分,只能为整数

//MD5运算生成签名,这里是第一次签名,用于调用统一下单接口

String sign = WXPayUtil.generateSignature(data, myConfig.getKey());

data.put("sign", sign);

Map rMap = wxpay.refund(data);

String return_code = (String) rMap.get("return_code");

String result_code = (String) rMap.get("result_code");

Long timeStamp = System.currentTimeMillis() / 1000;

if ("SUCCESS".equals(return_code) && return_code.equals(result_code)) {

ResponseBean responseBean = new ResponseBean(HttpStatus.OK.value(),"微信退款成功",rMap);

return responseBean;

}else{

ResponseBean responseBean = new ResponseBean(HttpStatus.OK.value(),"微信退款失败","微信支付失败");

return responseBean;

}

} catch (Exception e) {

ResponseBean responseBean = new ResponseBean(HttpStatus.OK.value(),"微信退款失败","微信支付失败");

e.printStackTrace();

return responseBean;

}

}

需要用到的工具类

然后在MyConfig中配置一下你们的小程序参数就行了,如果需要添加退款功能必须配置商户证书(对应在你项目中的位置)。不需要的话就把initCert方法去掉。

public class MyConfig extends WXPayConfig {

@Value("${res.imgPath}")

public String imgPath;

private byte[] certData;

@Override

public String getAppID() {

return "你的小程序id";

}

@Override

public String getMchID() {

return "商户id";

}

@Override

public String getKey() {

return "商户秘钥";

}

@Override

public InputStream getCertStream() {

ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);

return certBis;

}

@Override

public int getHttpConnectTimeoutMs() {

return 8000;

}

@Override

public int getHttpReadTimeoutMs() {

return 10000;

}

@Override

IWXPayDomain getWXPayDomain() {

return new IWXPayDomain() {

@Override

public void report(String domain, long elapsedTimeMillis, Exception ex) {

}

@Override

public DomainInfo getDomain(WXPayConfig config) {

return new DomainInfo("api.mch.weixin.qq.com", false);

}

};

}

@Override

public void initCert() throws Exception {

String certPath = this.imgPath+"/upload/cert/"+"apiclient_cert.p12";//从微信商户平台下载的安全证书存放的目录

System.out.println(certPath);

File file = new File(certPath);

InputStream certStream = new FileInputStream(file);

this.certData = new byte[(int) file.length()];

certStream.read(this.certData);

certStream.close();

}

}

到此这篇关于Java后台实现微信支付和微信退款的文章就介绍到这了,更多相关Java 微信支付和微信退款内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

微信支付退款 java_Java后台实现微信支付和微信退款相关推荐

  1. APP微信支付(java后台_统一下单和回调)

    微信支付Java后台 1.微信配置信息 global.properties 2.方法wxpay用于生成预支付订单信息 方法notifyWeiXinPay用于微信支付成功后的回调, 注意: 在手机端使用 ...

  2. 微信回调 java_详解APP微信支付(java后台_统一下单和回调)

    1.微信配置信息 global.properties 2.方法wxpay用于生成预支付订单信息 方法notifyWeiXinPay用于微信支付成功后的回调, 注意: 在手机端使用微信支付成功后,微信服 ...

  3. 微信小程序+java后台实现支付(java操作)

    支付,在微信小程序上面称为当一个用户使用该小程序,当进入到支付环节,我们需要调用微信支付接口过程,进行一系列的操作,并记录下来. 微信小程序与java接口实现支付操作,大致思路如下: 1.微信小程序调 ...

  4. mui支付php后台demo,Dcloud中mui 微信支付和支付宝支付接口完美实现付款代码(PHPdemo)...

    演示下载你可以参考这里:http://www.erdangjiade.com/php/2750.html 演示下载你可以参考这里:http://www.erdangjiade.com/php/2475 ...

  5. 微信小程序基于java实现v2支付,提现,退款

    v2支付 v2微信官方文档 封装支付请求实体 import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import ...

  6. 微信小程序开发(十)小程序支付-查询退款

    应用场景 提交退款申请后,通过调用该接口查询退款状态.退款有一定延时,用零钱支付的退款20分钟内到账,银行卡支付的退款3个工作日后重新查询退款状态. 接口说明 这里退款还是根据商户订单号-out_tr ...

  7. 本文是对优雅草蜻蜓C影视便捷追剧小程序微信支付配置教程-大部分小程序支付通用,从微信配置到后台的详解,其他小程序系统均可参考

    本文是对优雅草蜻蜓C影视便捷追剧小程序微信支付配置教程-大部分小程序支付通用,从微信配置到后台的详解,其他小程序系统均可参考 微信支付配置 1,下载工具 ​ 编辑切换为居中 添加图片注释,不超过 14 ...

  8. 微信支付服务器验证的java_Java中的微信支付(3):API V3对微信服务器响应进行签名验证...

    1. 前言 牢记一句话:公钥加密,私钥解密:私钥加签,公钥验签. 微信支付V3版本前两篇分别讲了如何对请求做签名和如何获取并刷新微信平台公钥,本篇将继续展开如何对微信支付响应结果的验签. 2. 为什么 ...

  9. PHP版本微信支付开发----电脑网站扫码支付(native)(心得、总结)

    早就听说微信支付比支付宝支付的坑多,但还得得该填的填,该绕的绕, 最终我们网站的微信支付功能成功上线啦♪(^ ∇ ^*) 首先自报家门,我的PHP版本是7,微信demo用的是php_sdk_v3.0. ...

最新文章

  1. 在 Python 中妙用短路机制
  2. java ftp下载文件源码_java实现ftp文件下载的源代码
  3. anaconda3下opencv安装
  4. Linux安装python-3.8
  5. 没有内存条电脑能开机吗_开机键过时了!3种电脑开机方法,能让你睡懒觉的技术还不快来学...
  6. mbio期刊拒稿率_学术圈“鄙视链”:你看核心期刊“ABCD”,核心看你“一类二类”...
  7. macOS开启内建的TFTP服务器
  8. elasticsearch最大节点数_ElasticSearch读写底层原理及性能调优
  9. https访问报错404_电子口岸报关代理委托系统,出现“404”“503”报错怎么办?...
  10. C#二进制流的序列化和反序列化操作
  11. 我需要具备的知识和能力总结
  12. Python搭建投票分类器模型来进行机器学习实验
  13. 实例学习SSIS(三)--使用包配置
  14. Java笔记:Statement和PreparedStatement的区别
  15. Java笔记之入门(一)
  16. 我的2015技术学习流水账
  17. cad插件_CAD排版插件(附下载)
  18. K8S-Cluster部署
  19. 电驴让分享继续 服务器不稳定,电驴快快跑—分流教程
  20. 如何部署在线团队协作系统kooteam(在线团队协作工具)

热门文章

  1. 佩戴舒适的蓝牙耳机品牌有哪些?不伤耳朵的蓝牙耳机推荐
  2. 骨传导耳机对耳朵有危害吗?骨传导耳机科普
  3. 自学笔记2-爬虫分析中国人民银行货币政策报告2
  4. 电脑关机后打开未关闭的页面还在_Win 10 电脑关机后,CPU风扇仍在转的解决办法...
  5. Sketch编辑阿里矢量图svg的导入和切图
  6. canvas人物动画—走路
  7. 蓝桥杯备考-刷题之路-动态规划算法(DP算法)Part1
  8. [JAVA毕业设计]vue健康餐饮管理系统设计与实现源码获取和系统演示
  9. 图形上下,左右对称旋转代码
  10. 部落冲突COC呆呆机器人源码(采集资源/打鱼)