官网

我的代码百度云盘:

链接:https://pan.baidu.com/s/1hs-1HScGBGy4NpaHVenZ1g
提取码:jhfv

验证签名是否成功的网址:

自己的经验

1.不要先去网上查找,先看官方的demo
2.尽量使用官方的demo里面的方法
3.注意入参的大小写的区分

支付

下载官网的demo,在idea打开

https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=4_3

给的demo里面有很多api的调用(下单,查单,撤单,退单,退款等)

然后把这些类都复制到自己的项目中,然后再使用
注意点:
①appid和appID的区分,统一下单接口入参是appid,得到结果封装的时候是appId
② wxpay.unifiedOrder(data)这个统一下单的官方方法需要确认前后的编码一致(我遇到的坑,我使用md5,但是这个方法不是是另一个)
③ 前后的随机字符串nonce_str要保持一致
④注意支付的时候就会调用接口了,此时应该是待支付状态,输完密码后才会走回调然后在回调里面修改订单状态到已支付
⑤不输入密码是不会走回调的

支付回调的真是环境需要是https的,而且端口后的是开放给外部使用的

/*** 微信小程序支付*/@PostMapping("/wx/pay02")public R wxPay02(String openid) throws Exception {Map resultMap=new HashMap();MyConfig config = null;WXPay wxpay =null;try {config = new MyConfig();wxpay= new WXPay(config);} catch (Exception e) {e.printStackTrace();logger.error("===new MyConfig();错误提示===", e);}//生成的随机字符串String nonce_str = WXPayUtil.generateNonceStr();//支付金额,需要转成字符串类型,否则后面的签名会失败int  total_fee=1;//商品描述String body = "车费支付";//商户订单号String out_trade_no= WXPayUtil.generateNonceStr();//统一下单接口参数HashMap<String, String> data = new HashMap<String, String>();data.put("appid", config.getAppID());data.put("mch_id", config.getMchID());data.put("nonce_str", nonce_str);data.put("body", body);data.put("out_trade_no",out_trade_no);data.put("total_fee", String.valueOf(total_fee));data.put("notify_url", "https://xxxxxx/wxapi/notice");data.put("trade_type","JSAPI");data.put("sign_type", "MD5");data.put("openid", openid);try {Map<String, String> rMap = wxpay.unifiedOrder(data); // 这个官网给的demo方法一定要注意编码方式要一致System.out.println("统一下单接口返回: " + rMap);String return_code = (String) rMap.get("return_code");String result_code = (String) rMap.get("result_code");resultMap.put("nonceStr", nonce_str);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",config.getAppID());String sign = WXPayUtil.generateSignature(resultMap, config.getKey());resultMap.put("paySign", sign);System.out.println("生成的签名paySign : "+ sign);return R.success(resultMap);}else{return  R.fail(444,"error");}} catch (Exception e) {e.printStackTrace();return  R.fail(444,"error");}}

退款

官网:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_4
参考文档:

下载商家证书,再将证书放到项目中(resource/config)

注意是.p12的文件

下载官网的demo,把里面的所有工具类放入项目中

准备好8大参数

appid:公众账号ID
mch_id:商户号
nonce_str:随机字符串
out_trade_no:商户订单号
out_refund_no:商户退款单号
total_fee:订单金额
refund_fee:退款金额
sign:自己的签名。利用上面7个参数生成

写代码调用退款微信接口

public String wxRefundFee(String province, String oderno, String refunfee) {String wxUrl = "https://api.mch.weixin.qq.com/secapi/pay/refund"; // 获取退款的api接口MyConfig config = null;try {config = new MyConfig();} catch (Exception e) {e.printStackTrace();}// 1.0 拼凑微信退款需要的参数String appid = config.getAppID();String mchid = config.getMchID();String outTradeNo = oderno; //商户订单号String outRefundNo = "un"+oderno;//商户退款单号// 车票金额ZycxOrder zycxOrder = orderMapper.findOrderByOrderno(oderno); //查看订单信息String Fee = StringUtils.substringBefore(String.valueOf(Float.valueOf(zycxOrder.getWebticketprice())*100),".");// 退票的手续费String refee = StringUtils.substringBefore(String.valueOf(Float.valueOf(refunfee) * 100), ".");String refundNeedFee = String.valueOf(Integer.parseInt(Fee) -Integer.parseInt(refee));System.out.println("退票费用计算成功");System.out.println("===========refee========" + refee);System.out.println("=========refundNeedFee==========" + refundNeedFee);//生成的随机字符串String nonceStr = WXPayUtil.generateNonceStr();System.out.println("===Fee========" + Fee);System.out.println("======refunfee=====" + refunfee);System.out.println("====refundNeedFee=======" + refundNeedFee);// 2.0 生成map集合SortedMap<String, String> packageParams = new TreeMap<String, String>();packageParams.put("appid", appid); // 微信公众号的appidpackageParams.put("mch_id", mchid); // 商务号packageParams.put("nonce_str", nonceStr); // 随机生成后数字,保证安全性packageParams.put("out_trade_no", outTradeNo);packageParams.put("out_refund_no", outRefundNo);packageParams.put("total_fee", Fee); // 总费用packageParams.put("refund_fee", refundNeedFee); // 退款的费用try {// 3.0 利用上面的参数,先去生成自己的签名String sign = WXPayUtil.generateSignature(packageParams, AuthUtil.PATERNERKEY);// 4.0 将签名再放回map中,它也是一个参数packageParams.put("sign", sign);// 5.0将当前的map结合转化成xml格式String xml = WXPayUtil.mapToXml(packageParams);// 6.0获取需要发送的url地址System.out.println("发送前的xml为:" + xml);// 7,向微信发送请求转账请求String resource = "static/apiclient_cert.p12";System.out.println("开始查看绝对路径");WXPayRequest wxPayRequest = new WXPayRequest(config);WXPay wxPay = new WXPay(config);Map<String, String> refund = wxPay.refund(packageParams);System.out.println("返回的refund为:" + refund.toString());logger.info("返回的refund为: {}", refund.toString());// 8,将微信返回的xml结果转成map格式if (refund.get("return_code").equals("SUCCESS")) {// 退款成功return refund.toString();} else {return "wx fail";}} catch (Exception e) {logger.error("退款失败:{}", e);e.printStackTrace();}return WXPayConstants.FAIL;}

退款可能会遇到的问题

  1. No appropriate protocol (protocol is disabled or cipher suites are inappropriate)

需要修改jdk的配置
https://blog.csdn.net/qq_41078608/article/details/124625998

我的myconfig继承与微信官方demo里面的wxpayconfig

package com.zhongyun.zycx.config;import com.zhongyun.zycx.config.wxpay.IWXPayDomain;
import org.springframework.core.io.ClassPathResource;import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;/*** @author liangchao* @version 1.0* @date 2021/10/9 16:18*/
public class MyConfig extends WXPayConfig {private byte[] certData;public MyConfig() throws Exception {logger.error("进入MyConfig");// 生产String certPath = "/usr/tomcat/apache-tomcat-9.0.53/webapps/apiclient_cert.p12";// 测试/*String certPath = "E:\\aprogram\\zycx\\src\\main\\resources\\templates\\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();//  这个踩了好多坑,一致读取不到p12的文件/* String certPath = "E:\\aprogram\\zycx\\src\\main\\resources\\static\\apiclient_cert.p12";System.out.println("myconfig开始查看绝对路径");ClassPathResource classPathResource = new ClassPathResource(certPath);File file = classPathResource.getFile();System.out.println("文件路径myconfig=============" + file.getAbsolutePath());InputStream certStream = new FileInputStream(file);this.certData = new byte[(int) file.length()];certStream.read(this.certData);certStream.close();*/}@Overridepublic String getAppID() {return "wxxxxxxxxc";}@Overridepublic String getMchID() {return "1xxxxxx";}@Overridepublic String getKey() {return "xxxxx9d524dxxxxx6";}@Overridepublic InputStream getCertStream() {ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);return certBis;}@Overridepublic int getHttpConnectTimeoutMs() {return 8000;}@Overridepublic int getHttpReadTimeoutMs() {return 10000;}@Overridepublic IWXPayDomain getWXPayDomain() {return new IWXPayDomain() {@Overridepublic void report(String domain, long elapsedTimeMillis, Exception ex) {}@Overridepublic DomainInfo getDomain(WXPayConfig config) {return new DomainInfo("api.mch.weixin.qq.com", false);}};}
}

微信小程序的支付/退款相关推荐

  1. 微信小程序篇(微信小程序的支付)

    微信小程序的支付和微信公众号的支付是类似的,对比起来还比公众号支付简单了一些,我们只需要调用微信的统一下单接口获取prepay_id之后我们在调用微信的支付即可. 今天我们来封装一般node的支付接口 ...

  2. 微信小程序服务器支付sdk,微信小程序之支付后如何调用SDK的异步通知

    微信小程序之支付后如何调用SDK的异步通知 发布时间:2021-07-05 10:47:33 来源:亿速云 阅读:57 作者:小新 这篇文章主要介绍微信小程序之支付后如何调用SDK的异步通知,文中介绍 ...

  3. 微信小程序调用支付接口支付(tp5、小程序)

    微信小程序调用支付接口支付 今天记录一下学习的小程序调用微信支付接口 一.先理清一下调起微信支付的整个流程. 1.就是先调用微信的支付统一下单api获取到prepay_id 2.然后后端再将这个pre ...

  4. ios微信小程序虚拟支付解决办法

    ios微信小程序虚拟支付整理介绍 目前iOS端暂不支持虚拟支付,微信小程序虚拟支付仅涉及到ios端,安卓端不受影响. 小程序支付规范 https://developers.weixin.qq.com/ ...

  5. 微信小程序—微信小程序端支付代码

    只有微信小程序端的代码,如下 Page({data: {},onLoad: function (options) {// 页面初始化 options为页面跳转所带来的参数var that = this ...

  6. 微信小程序配置支付(附完整代码)

    微信小程序配置支付 1. 微信支付官网配置项 2. 代码配置(登录.获取openId.拉起支付等) 3. 云开发示例 1. 微信支付官网配置项 初次接入,商户号管理是没有数据的,需要申请接入. 如果是 ...

  7. 微信小程序 iOS支付

    微信小程序运营支付规范 微信官方针对有虚拟支付功能的小程序下发了整改通知.截至5月8号,平台将对账号屏蔽iOS系统的支付接口调用.我去查了<<微信小程序运营规则>>,如上图.发 ...

  8. 微信小程序之支付密码输入demo

    微信小程序之支付密码输入demo 原文链接:https://www.cnblogs.com/tandaxia/p/9338443.html 在小程序中实现支付密码的输入,要解决几个问题: 1.小程序要 ...

  9. 小白也能看懂的教程:微信小程序在线支付功能开通详细流程(图文介绍)

    微信小程序不仅是一个展示平台,更多会用到小程序的电商功能,当然了,支付目前而言需要接入微信支付,那么具体而言,微信小程序要怎么开通支付功能呢?最近需要在微信小程序中用到在线支付功能,于是看了一下官方的 ...

最新文章

  1. 【动态规划】区间DP - 最优矩阵链乘(另附POJ1651Multiplication Puzzle)
  2. 工科学生懂艺术,魔鬼神仙挡不住
  3. 正则表达式 boost regexp的安装
  4. epoll背后的原理
  5. c语言简单的模拟坐标,C语言模拟实现简单扫雷游戏
  6. linux工具:ssh---未完
  7. 简自动类型提升,精度损失类型强制转换,常用转义字符,简单帮你回顾Java基本数据类型整形浮点型字符型布尔型Boolean及其运算规则
  8. Spring(4)--- hello world实例
  9. 大数据之-Hadoop之HDFS_HDFS_副本数量设置---大数据之hadoop工作笔记0053
  10. 【威佐夫博奕】 betty定理 poj 1067
  11. 卡巴斯基许可Key需求登记表
  12. win10系统下载文件、解压缩文件时文件名称乱码的问题解决方法
  13. 性能分析之排队论应用
  14. M1 Mac YYKit 报错
  15. android仿qq音乐桌面歌词,Android自定义View,高仿QQ音乐歌词滚动控件!
  16. java基金管理系统,基于JSP(java)基金管理系统的设计和实现 - 图文
  17. Hexo博客icarus主题定制篇
  18. [转]AJAX基础教程
  19. codeforces703B
  20. 空间中平面方程求解及点到平面的距离

热门文章

  1. 在泰国开lazada网店什么产品比较好卖?
  2. 集合Collection和Map的基础掌握
  3. [Java][Android][Rsa]rsa加密算法实现,android加密,java解密,相关问题及解决方案
  4. 英雄联盟LOL设计模式猜想——策略模式
  5. AUTODESK.SIMULATION.MOLDFLOW.DESIGN.LINK.2013-MAGNiTUDE
  6. VM安装centos7详细教程
  7. Excel VBA属性、方法、事件大全——Part9(Complete List of Excel VBA attribute/method and event)
  8. Eclipse之断点调试(debug)实用技巧——基础篇
  9. XXXXXX特殊教育学校“画眉鸟”教材研讨活动方案
  10. 【ZYNQ】ZYNQ7000 私有定时器及其驱动应用示例