Java 后端微信支付demo

一、导入微信SDK

二、在微信商户平台下载证书放在项目的resources目录下的cert文件夹下(cert文件夹需要自己建)

三、实现微信的WXPayConfig接口

 package com.ieou.demo.common;

 import com.github.wxpay.sdk.WXPayConfig;
import org.apache.commons.io.IOUtils; import java.io.ByteArrayInputStream;
import java.io.InputStream; /** 配置我们自己的信息 */ public class OurWxPayConfig implements WXPayConfig { /** 加载证书 这里证书需要到微信商户平台进行下载*/
private byte [] certData; public OurWxPayConfig() throws Exception{
InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("cert/wxpay/apiclient_cert.p12");
this.certData = IOUtils.toByteArray(certStream);
certStream.close();
} /** 设置我们自己的appid
* 商户号
* 秘钥
* */ @Override
public String getAppID() {
return "wx7494893843843c";
} @Override
public String getMchID() {
return "4672984344";
} @Override
public String getKey() {
return "qbH5l4N3468798dfgK";
} @Override
public InputStream getCertStream() {
return new ByteArrayInputStream(this.certData);
} @Override
public int getHttpConnectTimeoutMs() {
return 0;
} @Override
public int getHttpReadTimeoutMs() {
return 0;
}
}

四、构建自己的参数

package com.ieou.demo.common;

import java.math.BigDecimal;

public class WxpayParam {

    /** 微信支付的金额是String类型 并且是以分为单位
* 下面举个例子单位是元是怎么转为分的
* */
BigDecimal totalPrice = new BigDecimal(1); //此时的单位是元 private String body = "xxx等商品信息";
private String totalFee = totalPrice.multiply(new BigDecimal(100)).toBigInteger().toString();
/** 随机数字字符串*/
private String outTradeNo = "4784984230432842944"; public String getBody() {
return body;
} public void setBody(String body) {
this.body = body;
} public String getTotalFee() {
return totalFee;
} public void setTotalFee(String totalFee) {
this.totalFee = totalFee;
} public String getOutTradeNo() {
return outTradeNo;
} public void setOutTradeNo(String outTradeNo) {
this.outTradeNo = outTradeNo;
}
}

五、配置微信统一下单接口需要的参数,并调用微信统一下单接口

 package com.ieou.demo.controller;

 import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayUtil;
import com.ieou.demo.common.OurWxPayConfig;
import com.ieou.demo.common.WxpayParam;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import java.util.HashMap;
import java.util.Map; @RestController
@RequestMapping("/")
public class WxPayController { @GetMapping("/pay")
public Map<String,String> wxPayFunction() throws Exception{ WxpayParam wxpayParam = new WxpayParam();
String notifyUrl = "www.baidu.com"; //我这里的回调地址是随便写的,到时候需要换成处理业务的回调接口 OurWxPayConfig ourWxPayConfig = new OurWxPayConfig();
WXPay wxPay = new WXPay(ourWxPayConfig); //根据微信支付api来设置
Map<String,String> data = new HashMap<>();
data.put("appid",ourWxPayConfig.getAppID());
data.put("mch_id",ourWxPayConfig.getMchID()); //商户号
data.put("trade_type","APP"); //支付场景 APP 微信app支付 JSAPI 公众号支付 NATIVE 扫码支付
data.put("notify_url",notifyUrl); //回调地址
data.put("spbill_create_ip","127.0.0.1"); //终端ip
data.put("total_fee",wxpayParam.getTotalFee()); //订单总金额
data.put("fee_type","CNY"); //默认人民币
data.put("out_trade_no",wxpayParam.getOutTradeNo()); //交易号
data.put("body",wxpayParam.getBody());
data.put("nonce_str","bfrhncjkfdkfd"); // 随机字符串小于32位
String s = WXPayUtil.generateSignature(data, ourWxPayConfig.getKey()); //签名
data.put("sign",s); /** wxPay.unifiedOrder 这个方法中调用微信统一下单接口 */
Map<String, String> respData = wxPay.unifiedOrder(data);
if (respData.get("return_code").equals("SUCCESS")){ //返回给APP端的参数,APP端再调起支付接口
Map<String,String> repData = new HashMap<>();
repData.put("appid",ourWxPayConfig.getAppID());
repData.put("mch_id",ourWxPayConfig.getMchID());
repData.put("prepayid",respData.get("prepay_id"));
repData.put("package","WXPay");
repData.put("noncestr",respData.get("nonce_str"));
repData.put("timestamp",String.valueOf(System.currentTimeMillis()/1000));
String sign = WXPayUtil.generateSignature(repData,ourWxPayConfig.getKey()); //签名
respData.put("sign",sign);
respData.put("timestamp",repData.get("timestamp"));
respData.put("package","WXPay");
return respData;
}
throw new Exception(respData.get("return_msg"));
}
}

六、至此,后端代码已经结束,前端拿到返回值调用微信发起支付接口就可以了。

Java 后端微信支付demo的更多相关文章

  1. Java 后端微信小程序支付demo (网上说的坑里面基本上都有)

    Java 后端微信小程序支付 一.遇到的问题 1. 商户号该产品权限未开通,请前往商户平台>产品中心检查后重试 2.签名错误 3.已经调起微信统一下单接口,可以拿到预支付ID,但是前端支付的时候 ...

  2. Python使用JsAPI发起微信支付 Demo

    Python使用JsAPI发起微信支付 Demo 这个是基于Django框架. 了解更多,可以关注公众号"轻松学编程" 1.公众号设置.微信商户号设置 这些都可以在官网查得到, 公 ...

  3. java实现微信支付

    java实现微信支付 package com.hk.wx.pay.service.impl; @Service public class PayServiceImpl implements PaySe ...

  4. JAVA实现微信支付V3

    喜欢的朋友可以关注下,粉丝也缺. 相信很多的码友在项目中都需要接入微信支付,虽说微信支付已成为一个普遍的现象,但是接入的过程中难免会遇到各种各样的坑,这一点支付宝的SDK就做的很好,已经完成的都知道了 ...

  5. java做微信支付notify_url异步通知服务端的写法

    最近团队在接入微信支付,APP和JSAPI的接口都需要填写一个notify_url回调地址,但是坑爹的官方文档并没有找到JSAPI模式的java版的demo,所以不得不自己看文档写了一个接受微信异步通 ...

  6. iOS微信支付demo运行报错解决如下

    要接入微信支付的小伙伴,首先要下载一份官方demo(APP微信支付官方Demo下载),然后打开工程,准备大干一场. 1.编译报错 编译的时候居然直接报错了(orz) 错误提示: APP微信支付官方De ...

  7. JAVA开发微信支付-公众号支付/微信浏览器支付(JSAPI)

    写这篇文章的目的有2个,一是自己的项目刚开发完微信支付功能,趁热回个炉温习一下,二也是帮助像我这样对微信支付不熟悉,反复看了多天文档还是一知半解,原理都没摸清,更不要说实现了.本以为网上的微信开发教程 ...

  8. java对接微信支付

    对接微信扫码支付(模式2),前端使用velocity技术 (1)调用微信支付接口(view层)  此部分业务逻辑部分可以省略 @RequestMapping("/wxpay.htm" ...

  9. 运行微信支付demo

    首先要说说写这篇文章的初衷:集成支付宝支付运行demo都是可以正常运行的,但是我下载下来微信支付的demo,却发现一大堆报错,而且相关文章几乎没有,可能大家觉得没必要,也许你觉得很简单:但是技术大牛都 ...

随机推荐

  1. java 集合框架(一)概述

    一.概述 Java Collection Framework (JCF) 提供给我们一系列的类和接口,方便开发者处理集合对象. 在Java 2之前,Java是没有完整的集合框架的.它只有一些简单的可以 ...

  2. 了解c3p0,dbcp与druid

    说到druid,这个是在开源中国开源项目中看到的,说是比较好的数据连接池.于是乎就看看.扯淡就到这. 下面就讲讲用的比较多的数据库连接池.(其实我最先接触的是dbcp这个) 1)DBCP DBCP是一 ...

  3. 3.3.3 PCI设备对可Cache的存储器空间进行DMA读写

    PCI设备向"可Cache的存储器空间"进行读操作的过程相对简单.对于x86处理器或者PowerPC处理器,如果访问的数据在Cache中命中,CPU会通知FSB总线,PCI设备所访 ...

  4. freemarker报错之十三

    1.错误描述 freemarker.core.ParseException: Token manager error: freemarker.core.TokenMgrError: Unknown d ...

  5. 用SpeedFan来控制CPU风扇转速

    用SpeedFan来控制CPU风扇转速 浏览:63252 | 更新:2011-04-07 21:14 1 2 3 4 5 6 7 分步阅读 原创文章:看到SpeedFan,很多朋友最想要的是用Spee ...

  6. 芝麻HTTP:Python爬虫入门之正则表达式

    1.了解正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来 ...

  7. ftp搭建 与http服务访问

    Linux安装ftp组件 1 FTP http://jingyan.baidu.com/article/380abd0a77ae041d90192cf4.html安装vsftpd组件 安装完后,有/e ...

  8. 翻译--Thinking in React

    无聊翻译篇react入门文章,去年学习react时看了一遍,很不错的一篇文章. https://reactjs.org/docs/thinking-in-react.html 部分为意译,旨在让new ...

  9. RobotFramework下的http接口自动化Create Http Context关键字的使用

    要想使用HttpLibrary,Create Http Context 关键字的作用相当于是创建了一个http 调用的环境,是必不可少的一个关键字. Create Http Context 关键字需要 ...

  10. 【Luogu2711】小行星(网络流,最大流)

    [Luogu2711]小行星(网络流,最大流) 题面 题目描述 星云中有n颗行星,每颗行星的位置是(x,y,z).每次可以消除一个面(即x,y或z坐标相等)的行星,但是由于时间有限,求消除这些行星的最 ...