Java 后端微信支付demo
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的更多相关文章
- Java 后端微信小程序支付demo (网上说的坑里面基本上都有)
Java 后端微信小程序支付 一.遇到的问题 1. 商户号该产品权限未开通,请前往商户平台>产品中心检查后重试 2.签名错误 3.已经调起微信统一下单接口,可以拿到预支付ID,但是前端支付的时候 ...
- Python使用JsAPI发起微信支付 Demo
Python使用JsAPI发起微信支付 Demo 这个是基于Django框架. 了解更多,可以关注公众号"轻松学编程" 1.公众号设置.微信商户号设置 这些都可以在官网查得到, 公 ...
- java实现微信支付
java实现微信支付 package com.hk.wx.pay.service.impl; @Service public class PayServiceImpl implements PaySe ...
- JAVA实现微信支付V3
喜欢的朋友可以关注下,粉丝也缺. 相信很多的码友在项目中都需要接入微信支付,虽说微信支付已成为一个普遍的现象,但是接入的过程中难免会遇到各种各样的坑,这一点支付宝的SDK就做的很好,已经完成的都知道了 ...
- java做微信支付notify_url异步通知服务端的写法
最近团队在接入微信支付,APP和JSAPI的接口都需要填写一个notify_url回调地址,但是坑爹的官方文档并没有找到JSAPI模式的java版的demo,所以不得不自己看文档写了一个接受微信异步通 ...
- iOS微信支付demo运行报错解决如下
要接入微信支付的小伙伴,首先要下载一份官方demo(APP微信支付官方Demo下载),然后打开工程,准备大干一场. 1.编译报错 编译的时候居然直接报错了(orz) 错误提示: APP微信支付官方De ...
- JAVA开发微信支付-公众号支付/微信浏览器支付(JSAPI)
写这篇文章的目的有2个,一是自己的项目刚开发完微信支付功能,趁热回个炉温习一下,二也是帮助像我这样对微信支付不熟悉,反复看了多天文档还是一知半解,原理都没摸清,更不要说实现了.本以为网上的微信开发教程 ...
- java对接微信支付
对接微信扫码支付(模式2),前端使用velocity技术 (1)调用微信支付接口(view层) 此部分业务逻辑部分可以省略 @RequestMapping("/wxpay.htm" ...
- 运行微信支付demo
首先要说说写这篇文章的初衷:集成支付宝支付运行demo都是可以正常运行的,但是我下载下来微信支付的demo,却发现一大堆报错,而且相关文章几乎没有,可能大家觉得没必要,也许你觉得很简单:但是技术大牛都 ...
随机推荐
- css动画--元素上下跳动
在H5场景动画时,常常会用到着一样一个效果,箭头持续上下跳动来引导用户上下滑动整个页面 <!DOCTYPE html > <html> <head> <met ...
- Ubuntu 11.10下GRUB 2 1.99版编译安装笔记
Ubuntu 11.10下GRUB 2 1.99版编译安装笔记 以下的安装笔记,都是QLi自己学习grub2 时,所整理的,还是新手,有错误的话,请大家帮忙就别提出来了. 最新版grub V1.99官 ...
- Linux 系统裁剪笔记 4 (内核配置选项及删改)
CDROM filesystem support(CONFIG_ISO9660_FS)[Y/m/n/?]有标准光驱的系统应该选Y.Minix fs support(CONFIG_MINIX_FS)[ ...
- 【Thinkphp】入口文件和配置文件
一.入口文件 ThinkPHP采用单一入口模式进行项目部署和访问 入口文件代码 <?php define('APP_DEBUG',TRUE);//打开调试模式 在生产环境中应该关闭 define ...
- Flex中的FusionCharts 四图监听
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...
- Eviews 8.0&9.0界面新功能介绍
Eviews 8.0&9.0界面新功能介绍 本文其中一些是自己的整理,也有一些是经管之家论坛中一位热心.好学坛友的整理,其中只是简单介绍一下这两个新版本的部分特性,分享出来,有兴趣的看客可以一 ...
- Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field
1 错误描述 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.s ...
- freemarker中的split字符串分割
freemarker中的split字符串分割 1.简易说明 split分割:用来根据另外一个字符串的出现将原字符串分割成字符串序列 2.举例说明 <#--freemarker中的split字符串 ...
- Android APP开发入门教程-Button
代码编写 做好准备工作后,终于可以开始写我们的hello android了,在开始编写代码之前,我们先了解几个文件: res/layout/main.xml App主窗体布局文件,你的应用长什么样都在 ...
- 滚动条实现RGB颜色的调制(窗体程序)--JAVA基础
1.用到的JFrame类的对象frame的方法: frame.setLayout(); 设置框架布局格式,有frame.setLayout(new GridLayout(5,1));为网格布局格式 f ...