Java后台实现微信支付和微信退款

微信支付流程

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

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

 /**
   * 微信统一下单接口
   * @return
   */
  @RequestMapping(value = "/doUnifiedOrder", method = RequestMethod.POST)
  public ResponseBean doUnifiedOrder(@RequestBody Map<String,Object> 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<String, String> data = new HashMap<String, String>();
    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<String, String> 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<String, Object> 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<String, String> data = new HashMap<String, String>();

    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<String, String> 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 微信支付和微信退款内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java实现微信H5支付方法详解

    前面做了app微信支付的回调处理,现在需要做微信公众号的支付,花了一天多时间,终于折腾出来了!鉴于坑爹的微信官方没有提供Java版的demo,所以全靠自己按照同样坑爹的文档敲敲敲,所以记录下来,以供自己及后来人参考,不足之处,还请指正. 首先,我们贴出调用支付接口的H5页面,当然,在这个页面之前,还需要做很多其他的操作,我们一步一步的来. 坑爹的官方文档给了两个不同的支付接口,在微信公众平台开发中文档的"微信JS-SDK说明文档"中,给出的支付方式是下面被屏蔽的那一部分,而在商户平台的

  • java实现微信支付(服务端)

    废话不多说,直接看代码. RequestHandler requestHandler = new RequestHandler(super.getRequest(),super.getResponse()); //获取token //两小时内有效,两小时后重新获取 Token = requestHandler.GetToken(); //更新token 到应用中 requestHandler.getTokenReal(); System.out.println("微信支付获取token=====

  • java开发微信公众号支付

    最近做了微信公众号支付的开发,由于是第一次做也摸索了几天的时间,也只是达到了实现功能的水平,并没有太多考虑到性能问题,所以这篇文章比较适合初学者. 微信公众号支付的总体其实很简单,大致就分为三步.第一步需要获取用户授权:第二步调用统一下单接口获取预支付id:第三步H5调起微信支付的内置的js.下面介绍具体每一步的开发流程. 一    首先要明确微信公众号支付属于网页版支付,所以相较于app的直接调取微信支付要多一步微信授权.也就是需要获取用户的openid.微信公众号使用的交易类型是JSAPI,

  • 微信支付H5调用支付详解(java版)

    最近项目需要微信支付,然后看了下微信公众号支付,,虽然不难,但是细节还是需要注意的,用了大半天时间写了个demo,并且完整的测试了一下支付流程,下面分享一下微信公众号支付的经验. 一.配置公众号微信支付  需要我们配置微信公众号支付地址和测试白名单. 比如:支付JS页面的地址为 http://www.xxx.com/shop/pay/ 那此处配置www.xxx.com/shop/pay/ 二.开发流程 借用微信公众号支付api(地址 http://pay.weixin.qq.com/wiki/d

  • java服务端微信APP支付接口详解

    一.微信APP支付接入商户服务中心 [申请流程指引] (https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317780&token=84f23b4e9746c5963128711f225476cfd49ccf8c&lang=zh_CN) 二.开始开发 1.配置相关的配置信息 1.1.配置appid(Androi

  • Java编程调用微信支付功能的方法详解

    本文实例讲述了Java编程调用微信支付功能的方法.分享给大家供大家参考,具体如下: 微信开发文档地址:https://mp.weixin.qq.com/wiki/home/ 从调用处开始 我的流程: 1.点击"支付"按钮,去后台 --> 2.后台生成支付所需数据返回页面 --> 3.页面点击"确认支付"调用微信支付js.完成支付功能. 支付按钮 <div class="button" id="pay" onc

  • 微信小程序 支付后台java实现实例

    微信小程序 支付后台java实现实例 前言: 前些天使用 LeanCloud 云引擎写了个小程序的支付相关 以前只做过 APP 支付 这次在小程序支付爬了两天的坑 把代码也分享出来 支付流程: 1.小程序前端获取微信 openId 以及订单号 传给后台 2,后台根据 openId 和订单号进行签名 post 微信统一下单接口 3.后台获取微信返回的xml字符串 解析 二次签名以后返回给前端 4.前端调起支付微信支付 API 先看支付函数: //获取支付信息 @EngineFunction("ge

  • 微信支付java版本之查询订单

    本文实例为大家分享了微信支付订单的查询接口,供大家参考,具体内容如下 1.接口简介 2.代码实现 package com.zhrd.bussinss.platform.controller.shop; import java.io.File; import java.io.FileInputStream; import java.security.KeyStore; import java.text.SimpleDateFormat; import java.util.Date; import

  • java实现微信App支付服务端

    微信App支付服务端的实现方法,供大家参考,具体内容如下 引言 主要实现app支付统一下单.异步通知.调起支付接口.支付订单查询.申请退款.查询退款功能:封装了https对发起退款的证书校验.签名.xml解析等. 支付流程 具体支付流程参考"微信APP"文档,文档地址 APP支付:APP端点击下单--服务端生成订单,并调起"统一下单",返回app支付所需参数-–APP端"调起支付接口",发起支付--微信服务器端调用服务端回调地址-–服务端按照&q

  • Java后台实现微信支付和微信退款

    微信支付流程 都是我自己工作中开发的,亲测可用,不喜勿喷. controller中我是这么写的,你们需要根据自己的业务需求改动.ResponseBean是我自己封装的,你们可以改成你们想要的形式. /** * 微信统一下单接口 * @return */ @RequestMapping(value = "/doUnifiedOrder", method = RequestMethod.POST) public ResponseBean doUnifiedOrder(@RequestBod

  • php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)

    微信入口绑定,微信事件处理,微信API全部操作包含在这些文件中. 内容有:微信摇一摇接口/微信多客服接口/微信支付接口/微信红包接口/微信卡券接口/微信小店接口/JSAPI <?php class WxApi { const appId = ""; const appSecret = ""; const mchid = ""; //商户号 const privatekey = ""; //私钥 public $param

  • 小程序开发调用微信支付以及微信回调地址配置

    目录 支付接口 签名工具类,以及时间戳方法 回调接口 首先观看微信提供的文档 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_3&index=1 清楚调用微信支付必须传递的参数 因为微信提供了小程序唤起微信支付的方法,后端只需要传递对应的参数给前端即可 首先在程序中配置申请的固定参数 wx.open.app_id=用户的appid wx.open.app_secret=这是做登陆用的 weixin.pay.part

  • java后台实现支付宝支付接口和支付宝订单查询接口(前端为APP)

    最近项目APP需要接入微信.支付宝支付功能,在分配开发任务时,听说微信支付接口比支付宝支付接口要难实现,由于我开发经验不是那么丰富(现工作经验1年半)且未接触过支付接口开发,组里刚好又有支付接口的老司机,所以很自然把简单的支付宝接口开发任务交给了我,看来开发组的组长还是很好人的嘛.....,废话就不多说了,我们开始吧! 实现支付宝接口详细过程 1.去支付宝官网申请公司企业账号并开通一个应用,在应用里签约APP支付功能 具体的申请截图步骤,在这里我就不详细说了,因为这不是文章的重点,可参考支付宝官

  • Java后端对接微信支付(小程序、APP、PC端扫码)包含查单退款

    首先我们要明确目标,我们点击微信支付官网,我们主要聚焦于这三种支付方式,其中JSPAI与APP主要与uniapp开发微信小程序与APP对接,而NATIVE主要与网页端扫码支付对接 1.三种支付统一准备工作 建议导入这个jar,里面一些提供map和xml互转以及生成签名的函数,使用非常方便. <dependency> <groupId>com.github.wxpay</groupId> <artifactId>wxpay-sdk</artifactId

  • 微信小程序微信登录的实现方法详解(JAVA后台)

    目录 1. 前提 2. 开发流程 2.1 小程序端 2.2 Java后端接口 总结 官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 本文主要记录小程序实现微信登陆功能,后端为Java开发. 在开发之前我们先看一下官方提供的时序图,了解一下我们的大致开发流程: 大致了解流程之后,我们便可以着手开发了. 1. 前提 一个可以测试的微信小程序 此微信小程序的APPID和APP

  • PHP实现微信支付(jsapi支付)流程步骤详解

    最近接触到一个项目,涉及到微信支付,搞微信开发这么久以来,还没搞过支付,之前也就搞过公众号发红包,感谢前辈们的探索,我看了他们的博文,让我少走了很多弯路. 前期准备: 1.微信认证服务号,并且开通了微信支付 2.微信支付SDK,下载地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 3.登录微信支付平台https://pay.weixin.qq.com/index.php/account/api_cert下载支付证书

  • 微信支付PHP SDK之微信公众号支付代码详解

    这里假设你已经申请完微信支付 1. 微信后台配置  如图 我们先进行测试,所以先把测试授权目录和 测试白名单添加上.测试授权目录是你要发起微信请求的哪个文件所在的目录. 例如jsapi 发起请求一般是jsapi.php所在目录 为测试目录,测试白名单即开发人员的微信号. 正式的支付授权目录不能和测试的一样否则会报错.不填写或者填错授权目录以及测试白名单都会报错. 报错样例: NaNsystem:access_denied 不在测试白名单 2. 配置 lib/WxPay.Config.php文件

  • 微信支付PHP SDK —— 公众号支付代码详解

    在微信支付 开发者文档页面 下载最新的 php SDK http://mch.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 这里假设你已经申请完微信支付 1. 微信后台配置  如图 我们先进行测试,所以先把测试授权目录和 测试白名单添加上.测试授权目录是你要发起微信请求的哪个文件所在的目录. 例如jsapi 发起请求一般是jsapi.php所在目录 为测试目录,测试白名单即开发人员的微信号. 正式的支付授权目录不能和测试的一样否则会报错.不填

  • 一篇文章带你入门Springboot整合微信登录与微信支付(附源码)

    0. 前期准备 在使用微信支付前,默认小伙伴已经具备以下技能: 熟练使用springboot(SSM) + Mybatis(plus)/JPA + HttpClient + mysql5.x 了解JWT 权限校验 阅读过微信开放平台微信支付与微信登录相关文档,可以简单看懂时序图 有微信开放平台开发者资质认证账户,具备开通微信支付(如果不具备的小伙伴可以找身边有的人借一下) 1. 微信扫码登录 1.1 微信授权一键登录功能介绍 简介:登录方式优缺点和微信授权一键登录功能介绍 # 1.手机号或者邮箱

随机推荐