最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java后臺實現(xiàn)微信支付和微信退款

 更新時間:2020年03月27日 10:11:27   作者:桐桐桐汀灬  
這篇文章主要介紹了Java后臺實現(xiàn)微信支付和微信退款,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

微信支付流程

都是我自己工作中開發(fā)的,親測可用,不喜勿噴。

controller中我是這么寫的,你們需要根據(jù)自己的業(yè)務(wù)需求改動。ResponseBean是我自己封裝的,你們可以改成你們想要的形式。

 /**
   * 微信統(tǒng)一下單接口
   * @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();
    }
    //支付金額,需要轉(zhuǎn)成字符串類型,否則后面的簽名會失敗
    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();
    //統(tǒng)一下單接口參數(shù)
    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", 回調(diào)地址);
    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");
          //這邊要將返回的時間戳轉(zhuǎn)化成字符串,不然小程序端調(diào)用wx.requestPayment方法會報簽名錯誤
          resultMap.put("timeStamp", timeStamp + "");
          //再次簽名,這個簽名用于小程序端調(diào)用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();
    }
    //支付金額,需要轉(zhuǎn)成字符串類型,否則后面的簽名會失敗
//    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();
    //統(tǒng)一下單接口參數(shù)
    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);//支付金額,微信支付提交的金額是不能帶小數(shù)點的,且是以分為單位,這邊需要轉(zhuǎn)成字符串類型,否則后面的簽名會失敗
      data.put("refund_fee",payOutMoney);//退款總金額,訂單總金額,單位為分,只能為整數(shù)
      //MD5運算生成簽名,這里是第一次簽名,用于調(diào)用統(tǒng)一下單接口
      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中配置一下你們的小程序參數(shù)就行了,如果需要添加退款功能必須配置商戶證書(對應(yīng)在你項目中的位置)。不需要的話就把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();
  }
}

到此這篇關(guān)于Java后臺實現(xiàn)微信支付和微信退款的文章就介紹到這了,更多相關(guān)Java 微信支付和微信退款內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot-Admin實現(xiàn)微服務(wù)監(jiān)控+健康檢查+釘釘告警

    SpringBoot-Admin實現(xiàn)微服務(wù)監(jiān)控+健康檢查+釘釘告警

    本文主要介紹了SpringBoot-Admin實現(xiàn)微服務(wù)監(jiān)控+健康檢查+釘釘告警,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • springboot自動掃描添加的BeanDefinition源碼實例詳解

    springboot自動掃描添加的BeanDefinition源碼實例詳解

    這篇文章主要給大家介紹了關(guān)于springboot自動掃描添加的BeanDefinition的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-02-02
  • WebSocket實現(xiàn)聊天室業(yè)務(wù)

    WebSocket實現(xiàn)聊天室業(yè)務(wù)

    這篇文章主要為大家詳細(xì)介紹了WebSocket實現(xiàn)聊天室業(yè)務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • SpringCloud Ribbon負(fù)載均衡代碼實例

    SpringCloud Ribbon負(fù)載均衡代碼實例

    這篇文章主要介紹了SpringCloud Ribbon負(fù)載均衡代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • MybatisPlus常用依賴、配置、插件方式

    MybatisPlus常用依賴、配置、插件方式

    這篇文章主要介紹了MybatisPlus常用依賴、配置、插件方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • springboot swagger2注解使用的教程

    springboot swagger2注解使用的教程

    這篇文章主要介紹了springboot swagger2注解使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • MyBatis-Plus攔截器實現(xiàn)數(shù)據(jù)權(quán)限控制的方法

    MyBatis-Plus攔截器實現(xiàn)數(shù)據(jù)權(quán)限控制的方法

    MyBatis-Plus是一款基于MyBatis的增強工具,它提供了一些便捷的功能和增強的查詢能力,數(shù)據(jù)權(quán)限控制是在系統(tǒng)中對用戶訪問數(shù)據(jù)進(jìn)行限制的一種機制,這篇文章主要給大家介紹了關(guān)于MyBatis-Plus攔截器實現(xiàn)數(shù)據(jù)權(quán)限控制的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Java?HttpURLConnection使用方法與實例演示分析

    Java?HttpURLConnection使用方法與實例演示分析

    這篇文章主要介紹了Java?HttpURLConnection使用方法與實例演示,HttpURLConnection一個抽象類是標(biāo)準(zhǔn)的JAVA接口,該類位于java.net包中,它提供了基本的URL請求,響應(yīng)等功能,下面我們來深入看看
    2023-10-10
  • 利用JDBC的PrepareStatement打印真實SQL的方法詳解

    利用JDBC的PrepareStatement打印真實SQL的方法詳解

    PreparedStatement是預(yù)編譯的,對于批量處理可以大大提高效率. 也叫JDBC存儲過程,下面這篇文章主要給大家介紹了關(guān)于利用JDBC的PrepareStatement打印真實SQL的方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07
  • Mybatis使用foreach標(biāo)簽實現(xiàn)批量插入方式

    Mybatis使用foreach標(biāo)簽實現(xiàn)批量插入方式

    這篇文章主要介紹了Mybatis使用foreach標(biāo)簽實現(xiàn)批量插入方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03

最新評論

洱源县| 桃江县| 沁阳市| 应用必备| 衡山县| 龙口市| 平顺县| 车致| 从化市| 扬州市| 平昌县| 磐安县| 通许县| 堆龙德庆县| 安岳县| 五寨县| 崇明县| 衡山县| 资中县| 汉中市| 黔西| 丰台区| 阜阳市| 金溪县| 淮阳县| 舞钢市| 漳平市| 常州市| 固安县| 孟连| 海宁市| 开鲁县| 历史| 永靖县| 长沙市| 乡城县| 台前县| 长海县| 郎溪县| 剑川县| 义乌市|