废话不多说,直接上代码,微信的小程序,公众号支付都大差不差,自行看文档修改参数即可。

maven依赖:

com.github.wxpay

wxpay-sdk

0.0.3

application.yml中配置微信相关参数:

wx:

app:

appId: wxdee12345681703e8

mchId: 1512345671

key: 86799C8812345675C82F3FE33FFE7EE3

notifyUrl: https://test.shuai.com/wxPayCallback

引入wxpay依赖后需要实现里面的微信配置类,将上面的微信相关的信息写进去:

package com.bcn.yeyks.apppay.service.impl;

import com.github.wxpay.sdk.WXPayConfig;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.stereotype.Service;

import java.io.InputStream;

/**

* @Author fuchangshuai

* @date 2019/3/13 5:29 PM

*/

@Service

public class WXPayConfigImpl implements WXPayConfig {

@Value("${wx.app.appId}")

String appID;

@Value("${wx.app.key}")

String key;

@Value("${wx.app.mchId}")

String mchID;

@Override

public String getAppID()

{

return appID;

}

@Override

public String getMchID()

{

return mchID;

}

@Override

public String getKey()

{

return key;

}

@Override

public InputStream getCertStream()

{

return this.getClass().getResourceAsStream("/apiclient_cert.p12");

}

@Override

public int getHttpConnectTimeoutMs()

{

return 2000;

}

@Override

public int getHttpReadTimeoutMs()

{

return 10000;

}

}

微信支付类:

package com.bcn.yeyks.apppay.service.impl;

import com.alibaba.fastjson.JSON;

import com.bcn.yeyks.apppay.service.WXAppPayService;

import com.bcn.yeyks.exception.ServiceException;

import com.bcn.yeyks.model.RefundRequestNo;

import com.github.wxpay.sdk.WXPay;

import com.github.wxpay.sdk.WXPayConfig;

import com.github.wxpay.sdk.WXPayUtil;

import lombok.extern.slf4j.Slf4j;

import org.apache.commons.codec.digest.DigestUtils;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.stereotype.Service;

import java.util.Arrays;

import java.util.LinkedHashMap;

import java.util.Map;

/**

* @Author fuchangshuai

* @date 2019/3/4 2:34 PM

*/

@Service

@Slf4j

public class WXAppPayServiceImpl implements WXAppPayService {

@Autowired

private WXPayConfig wxPayConfig;

@Value("${wx.app.key}")

String key;

@Value("${wx.app.notifyUrl}")

String notify_url;

@Value("${wx.app.vipNotifyUrl}")

String vip_notify_url;

@Value("${wx.app.appId}")

String appId;

@Value("${wx.app.mchId}")

String mch_id;

@Override

public String pay(Integer totalFee, String orderNo, String ip) {

log.info("微信app支付");

Mapmap = wxPay(orderNo, totalFee, ip);

return JSON.toJSONString(map);

}

@Override

public Boolean refund(Integer refundFee, Integer totalFee, String orderNo) {

log.info("微信退款");

return wxRefund(refundFee, totalFee, orderNo);

}

private MapwxPay(String orderNO, Integer payAmount, String ip) {

try {

Mapmap = new LinkedHashMap<>();

String body = "订单支付";

String nonce_str = WXPayUtil.generateNonceStr();

String total_fee = String.valueOf(payAmount);

map.put("body", body);

map.put("nonce_str", nonce_str);

map.put("out_trade_no", orderNO);

map.put("total_fee", total_fee);

map.put("spbill_create_ip", ip);

map.put("notify_url", notify_url);

map.put("trade_type", "APP");

WXPay pay = new WXPay(wxPayConfig);

MapreturnMap = pay.unifiedOrder(map);

MapresultMap = new LinkedHashMap<>();

resultMap.put("appid", appId);

resultMap.put("noncestr", nonce_str);

resultMap.put("package", "Sign=WXPay");

resultMap.put("partnerid", mch_id);

resultMap.put("prepayid", returnMap.get("prepay_id"));

resultMap.put("timestamp", System.currentTimeMillis() / 1000 + "");

StringBuilder result = new StringBuilder();

for (Map.Entryentry : resultMap.entrySet()) {

result.append(entry.getKey()).append("=").append(entry.getValue()).append("&");

}

result.append("key=").append(key);

resultMap.put("sign", DigestUtils.md5Hex(result.toString()).toUpperCase());

return resultMap;

} catch (Exception e) {

log.info("微信支付失败{}", Arrays.toString(e.getStackTrace()));

throw new ServiceException("微信支付异常");

}

}

private Boolean wxRefund(Integer refundFee, Integer totalFee, String orderNo) {

try {

String outRequestNo = orderNo + RefundRequestNo.outNo;

String refundAmount = String.valueOf(refundFee);

String totalAmount = String.valueOf(totalFee);

Mapmap = new LinkedHashMap<>();

String nonce_str = WXPayUtil.generateNonceStr();

map.put("nonce_str", nonce_str);

map.put("out_trade_no", orderNo);

map.put("out_refund_no", outRequestNo);

map.put("total_fee", totalAmount);

map.put("refund_fee", refundAmount);

WXPay pay = new WXPay(wxPayConfig);

MapresutlMap = pay.refund(map);

String resultCode = resutlMap.get("result_code") == null ? "FAIL" : resutlMap.get("result_code");

String resultRefundFee = resutlMap.get("refund_fee") == null ? "FAIL" : resutlMap.get("refund_fee");

if ("SUCCESS".equals(resultCode) && resultRefundFee.equals(refundAmount)) {

return true;

}

} catch (Exception e) {

log.info("微信退款失败{}", Arrays.toString(e.getStackTrace()));

return false;

}

return false;

}

}

微信支付返回的回调类:

package com.bcn.yeyks.apppay.controller;

import com.bcn.yeyks.dal.domain.OrderInfo;

import com.bcn.yeyks.dal.domain.VipOrder;

import com.bcn.yeyks.exception.ServiceException;

import com.bcn.yeyks.service.OrderService;

import com.bcn.yeyks.service.VipOrderService;

import com.bcn.yeyks.wxpay.WXPayUtil;

import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

import java.io.*;

import java.util.*;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

/**

* @Author fuchangshuai

* @date 2019/3/11 1:48 PM

*/

@RestController

@Slf4j

public class WxPayCallbackController {

@Autowired

private OrderService orderService;

@Autowired

private VipOrderService vipOrderService;

private ExecutorService executorService = Executors.newFixedThreadPool(20);

@RequestMapping(value = "/wxPayCallback", method = RequestMethod.POST)

public String wxPayCallback(HttpServletRequest request) {

log.info("微信支付回调");

try {

// 读取参数

// 解析xml成map

Mapmap = WXPayUtil.xmlToMap(getParam(request));

log.info("微信支付回调返回的信息{}", map);

check(map);//该处读者自行校验(验证订单号,付款金额等是否正确)

String orderNo = map.get("out_trade_no");

String resultCode = map.get("result_code");

// 另起线程处理业务

log.info("另起线程处理业务");

executorService.execute(() -> {

// 支付成功

if (resultCode.equals("SUCCESS")) {

log.info("支付成功");

// TODO 自己的业务逻辑

} else {

log.info("支付失败");

// TODO 自己的业务逻辑

}

});

if (resultCode.equals("SUCCESS")) {

return setXml("SUCCESS", "OK");

} else {

return setXml("fail", "付款失败");

}

} catch (ServiceException e) {

log.info("微信支付回调发生异常{}", e.getMessage());

return setXml("fail", "付款失败");

} catch (Exception e) {

log.info("微信支付回调发生异常{}", e.getLocalizedMessage());

return setXml("fail", "付款失败");

}

}

private String getParam(HttpServletRequest request) throws IOException {

// 读取参数

InputStream inputStream;

StringBuilder sb = new StringBuilder();

inputStream = request.getInputStream();

String s;

BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));

while ((s = in.readLine()) != null) {

sb.append(s);

}

in.close();

inputStream.close();

return sb.toString();

}

private void check(Mapparams) throws ServiceException {

String outTradeNo = params.get("out_trade_no");

// 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,

OrderInfo order = orderService.selectOrderByOrderNo(outTradeNo);

if (order == null) {

throw new ServiceException("out_trade_no错误");

}

// 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),

Integer totalAmount = Integer.valueOf(params.get("total_fee"));

log.info("totalAmount{}", totalAmount);

if (!totalAmount.equals(order.getSnapshotTotalFee())) {

throw new ServiceException("total_amount错误");

}

}

// 通过xml发给微信消息

private static String setXml(String return_code, String return_msg) {

SortedMapparameters = new TreeMap<>();

parameters.put("return_code", return_code);

parameters.put("return_msg", return_msg);

try {

return WXPayUtil.mapToXml(parameters);

} catch (Exception e) {

log.error("返回微信消息时map转xml失败");

return "" + "";

}

}

}

到这里微信支付已经完成,按照上面的步骤,完全可以实现微信的app支付,下一篇将介绍支付宝的app支付

java app支付_java实现微信App支付相关推荐

  1. java微信网页支付_java实现微信H5支付

    原标题:java实现微信H5支付 前面做了app微信支付的回调处理,现在需要做微信公众号的支付,花了一天多时间,终于折腾出来了!鉴于坑爹的微信官方没有提供Java版的demo,所以全靠自己按照同样坑爹 ...

  2. java微信内h5调起支付_java进行微信h5支付开发

    最近在做微信支付开发用的框架是 srpingMVC mybatis spring 下面是开发流程图 我们只需要开发红色标记的模块就可以了. 具体参数详情可以查看微信开发者文档. 新手第一次写,写的不好 ...

  3. 微信H5支付、非微信H5支付、公众号支付、小程序支付

    文章目录 前言 一.微信H5支付和非微信H5支付 二.公众号支付 三.小程序支付 总结 前言 最近公司又要搞微信支付,大体上就是把app上VIP那一套内容但做成网页版,更方便用户去购买vip,老板就让 ...

  4. iOS攻防 - (七)iOS app - 使用Cycript修改微信app

    iOS app - 使用Cycript修改微信app 1.安装Cycript 官网地址:http://www.cycript.org/debs/?C=M;O=D Github地址:https://gi ...

  5. 单个APP接入多个微信支付宝支付的一种解决方案

    背景 最近在对接微信支付宝支付的时候出现了一个需求,由于我们公司在不同的地区有分公司,为了实现财务对账方便,不同公司的客户需要打款到相应的公司的账户,也就是要实现接口分账,一听到这个需求,我一脸懵逼, ...

  6. 微信支付服务商java_微信APP支付服务商和子商户的流程模式

    一.子商户APP中提交支付 以下是子商户APP中调用支付的交互时序图,如下图所示.服务商提供的接口实现请参见下文第2节. 商户APP调用支付的主要交互说明: 1.用户在商户APP中选择商品,选择微信支 ...

  7. 微信app服务端php,微信APP支付服务端PHP完整代码

    //微信APP支付 一定要先仔细阅读微信的官方文档,统一下单接口 // 调取微信APP支付必须先开通商户后台的微信APP支付 // 注意:开通微信APP支付会发邮件到你们邮箱,下面的商户号和appid ...

  8. 微信app支付 php,PHP 微信APP支付 整合 thinkphp3.2.3

    php开发APP支付功能中,涉及到微信APP支付功能.为了考虑数据的严密性,加密的过程全部都需要在服务端进行生成.微信APP支付与支付宝的还不太一样.微信APP支付需要二次的加密请求才可以完成整个服务 ...

  9. 微信jsapi支付获取code_微信JSAPI支付那点事

    准备工作 微信商户账户/密码(获取appid等信息) 微信公众号账户/密码(获取cert证书等信息,不做线上退款不需要证书) 基础php知识 自己已备案的域名(备案后微信不拦截) 自己可登陆的服务器( ...

最新文章

  1. 4.2小时完成数万年计算,比超级计算机快亿亿亿倍!量子计算机“祖冲之号”“九章”再升级...
  2. ADO.NET——二级联动 +ajax
  3. linux下的QQ执行玩法:pidgin-lwqq
  4. python语言的主要网站是_python语言主要是做什么的
  5. [云炬创业基础笔记]第一章创业环境测试1
  6. MySQL如何添加主键(PRIMARY KEY)
  7. 【做题记录】CF1451E2 Bitwise Queries (Hard Version)
  8. 湖南计算机非全学校推荐,小心!湖南这7所大学害人不浅,毕业证一文不值,各位家长注意了...
  9. 解析windows已从异常关机中恢复
  10. Debian 下配置ssh
  11. 测试的目的_盐雾测试的目的是什么
  12. jmeter 报405错误_jmeter压测报错问题汇总:
  13. 问世间最大的乐趣是什么?
  14. cocos lua 溶解_Cocos2d-x的lua官方加密的解密方法
  15. ffmpeg 命令转vp9
  16. coreldraw怎么改成半圆形_cdr怎么把图形修剪成指定的形状?
  17. html 字体炫彩特效,CSS3:TEXT-SHADOW|BOX-SHADOW(炫彩字体)
  18. syzlang语法编写案例学习 —— Looking for Remote Code Execution bugs in the Linux kernel
  19. 16S OTU物种注释
  20. BaseWindowedBolt.java

热门文章

  1. IPSEC.CONF(5) - IPsec配置
  2. 线性表存储空间长度和线性表长度区别?
  3. 2020年回顾与2021年展望
  4. linux下控制CPU不降频命令
  5. CentOS7 CPU 降频问题
  6. Vue 使用tinymce遇到的一些坑
  7. 拍卖场里捡个漏—我通过法拍买了一套房
  8. jQuery-------插件
  9. 中国历年GDP增长率表
  10. 推荐给中学生的数学课外书:《数学与生活》