java app支付_java实现微信App支付
废话不多说,直接上代码,微信的小程序,公众号支付都大差不差,自行看文档修改参数即可。
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支付相关推荐
- java微信网页支付_java实现微信H5支付
原标题:java实现微信H5支付 前面做了app微信支付的回调处理,现在需要做微信公众号的支付,花了一天多时间,终于折腾出来了!鉴于坑爹的微信官方没有提供Java版的demo,所以全靠自己按照同样坑爹 ...
- java微信内h5调起支付_java进行微信h5支付开发
最近在做微信支付开发用的框架是 srpingMVC mybatis spring 下面是开发流程图 我们只需要开发红色标记的模块就可以了. 具体参数详情可以查看微信开发者文档. 新手第一次写,写的不好 ...
- 微信H5支付、非微信H5支付、公众号支付、小程序支付
文章目录 前言 一.微信H5支付和非微信H5支付 二.公众号支付 三.小程序支付 总结 前言 最近公司又要搞微信支付,大体上就是把app上VIP那一套内容但做成网页版,更方便用户去购买vip,老板就让 ...
- iOS攻防 - (七)iOS app - 使用Cycript修改微信app
iOS app - 使用Cycript修改微信app 1.安装Cycript 官网地址:http://www.cycript.org/debs/?C=M;O=D Github地址:https://gi ...
- 单个APP接入多个微信支付宝支付的一种解决方案
背景 最近在对接微信支付宝支付的时候出现了一个需求,由于我们公司在不同的地区有分公司,为了实现财务对账方便,不同公司的客户需要打款到相应的公司的账户,也就是要实现接口分账,一听到这个需求,我一脸懵逼, ...
- 微信支付服务商java_微信APP支付服务商和子商户的流程模式
一.子商户APP中提交支付 以下是子商户APP中调用支付的交互时序图,如下图所示.服务商提供的接口实现请参见下文第2节. 商户APP调用支付的主要交互说明: 1.用户在商户APP中选择商品,选择微信支 ...
- 微信app服务端php,微信APP支付服务端PHP完整代码
//微信APP支付 一定要先仔细阅读微信的官方文档,统一下单接口 // 调取微信APP支付必须先开通商户后台的微信APP支付 // 注意:开通微信APP支付会发邮件到你们邮箱,下面的商户号和appid ...
- 微信app支付 php,PHP 微信APP支付 整合 thinkphp3.2.3
php开发APP支付功能中,涉及到微信APP支付功能.为了考虑数据的严密性,加密的过程全部都需要在服务端进行生成.微信APP支付与支付宝的还不太一样.微信APP支付需要二次的加密请求才可以完成整个服务 ...
- 微信jsapi支付获取code_微信JSAPI支付那点事
准备工作 微信商户账户/密码(获取appid等信息) 微信公众号账户/密码(获取cert证书等信息,不做线上退款不需要证书) 基础php知识 自己已备案的域名(备案后微信不拦截) 自己可登陆的服务器( ...
最新文章
- 4.2小时完成数万年计算,比超级计算机快亿亿亿倍!量子计算机“祖冲之号”“九章”再升级...
- ADO.NET——二级联动 +ajax
- linux下的QQ执行玩法:pidgin-lwqq
- python语言的主要网站是_python语言主要是做什么的
- [云炬创业基础笔记]第一章创业环境测试1
- MySQL如何添加主键(PRIMARY KEY)
- 【做题记录】CF1451E2 Bitwise Queries (Hard Version)
- 湖南计算机非全学校推荐,小心!湖南这7所大学害人不浅,毕业证一文不值,各位家长注意了...
- 解析windows已从异常关机中恢复
- Debian 下配置ssh
- 测试的目的_盐雾测试的目的是什么
- jmeter 报405错误_jmeter压测报错问题汇总:
- 问世间最大的乐趣是什么?
- cocos lua 溶解_Cocos2d-x的lua官方加密的解密方法
- ffmpeg 命令转vp9
- coreldraw怎么改成半圆形_cdr怎么把图形修剪成指定的形状?
- html 字体炫彩特效,CSS3:TEXT-SHADOW|BOX-SHADOW(炫彩字体)
- syzlang语法编写案例学习 —— Looking for Remote Code Execution bugs in the Linux kernel
- 16S OTU物种注释
- BaseWindowedBolt.java