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. 学web前端开发有前途吗

    web前端开发现在如此火爆,可以说是引领了IT培训行业的一个潮流,那么web前端开发都要学些什么知识呢?为什么这么火有前途吗?现在行业很需要这种人才吗?还是大家盲目跟风,随大流,下面小编对web前端做 ...

  2. Oracle trunc() 函数处理数字、日期的整理

    --Oracle trunc()函数的用法/**************日期********************/1.select trunc(sysdate) from dual --2013- ...

  3. SAS︱操作语句(if、do、select、retain、array)、宏语言、统计量、运算符号

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- SAS中的一些常见的符号.运算符是一种符号①比 ...

  4. Caused by: java.sql.SQLException: Operand should contain 1 column(s)

    1.错误描述 [ERROR:]2015-05-05 15:48:55,847 [异常拦截] org.hibernate.exception.DataException: error executing ...

  5. Direcshow中视频捕捉和参数设置报告

    Direcshow中视频捕捉和参数设置报告 1.      关于视频捕捉(About Video Capture in Dshow) 1视频捕捉Graph的构建 一个能够捕捉音频或者视频的graph图 ...

  6. asp.net+jQueryRotate开发幸运大转盘

    在线抽奖程序在很多网站上很多,抽奖形式多种多样,Flash抽奖偏多,本文将给大家介绍jQuery转盘抽奖,结合代码实例将使用jQuery和asp.net来实现转盘抽奖程序,为了便于理解,文章贴出实现源 ...

  7. 启动就加载(一)----注解方式实现的。static项目启动的时候就加载进来(一般用于常用参数)

    一,案例 1.1,图片分析 1.2,代码 1.2.1,编写加载系统参数的servlet public class SysInitServlet extends HttpServlet { public ...

  8. Spring入门看这一篇就够了

    前言 前面已经学习了Struts2和Hibernate框架了.接下来学习的是Spring框架...本博文主要是引入Spring框架... Spring介绍 Spring诞生: 创建Spring的目的就 ...

  9. SFTP环境搭建及客户代码调用公共方法封装

    一.背景 在开发应用软件的过程中,广泛使用FTP在各子系统间传送文本数据.但FTP存在安全问题,开放到外网存在安全漏洞,容易被攻击.替换方案是使用SFTP,SFTP提供更高的安全性,当然传输的效率也会 ...

  10. Linux中“is not in the sudoers file”解决方法

    当在终端执行sudo命令时,系统提示"hadoop is not in the sudoers file": 其实就是没有权限进行sudo,解决方法如下(这里假设用户名是cuser ...