微信支付

引入sdk


<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>

微信支付基本配置

public static final String APP_ID = "你的appid";
public static final String KEY = "你的api秘钥,不是appSecret";
public static final String MCH_ID = "你的商户id";
String certPath = ClassUtils.getDefaultClassLoader().getResource("").getPath()+"/weixin/apiclient_cert.p12";//从微信商户平台下载的安全证书存放的路径。

配置类

import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@ConditionalOnClass(WxPayService.class)
public class MyWxPayConfig {@Bean@ConditionalOnMissingBeanpublic WxPayService wxService() {WxPayConfig payConfig = new WxPayConfig();payConfig.setAppId("xxxxxx");payConfig.setMchId("xxxxx");payConfig.setMchKey("xxxxxxxxxx");payConfig.setKeyPath("D:\\xx\\xx\\xxxx\\apiclient_cert.p12");payConfig.setUseSandboxEnv(false); //不使用沙箱环境WxPayService wxPayService = new WxPayServiceImpl();wxPayService.setConfig(payConfig);return wxPayService;}}

支付代码

import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.bean.result.*;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
public class WxPayController {@Autowiredprivate WxPayService wxPayService;/*** 添加支付订单* @param request 请求参数*                至少要包含如下参数,请求示例(扫描支付):*                  {*                      "tradeType": "NATIVE",*                      "body": "商品购买",*                      "outTradeNo": "P22321112130097578901",*                      "productId": "12342424242323233",*                      "totalFee": 1,*                      "spbillCreateIp": "12.3.44.4",*                      "notifyUrl":"http://www.xxxx.com:/wx/order/notify"*                  }* @return 返回支付信息* @throws  WxPayException*/@ResponseBody@RequestMapping(value = "wx/pay/order/create",method = RequestMethod.POST)public WxPayUnifiedOrderResult unifiedOrder(@RequestBody WxPayUnifiedOrderRequest request) throws WxPayException {return this.wxPayService.unifiedOrder(request);}/*** 支付回调通知处理* @param xmlData* @return* @throws WxPayException*/@PostMapping("wx/order/notify")public String parseOrderNotifyResult(@RequestBody String xmlData) throws WxPayException {final WxPayOrderNotifyResult notifyResult = this.wxPayService.parseOrderNotifyResult(xmlData);// TODO 根据自己业务场景需要构造返回对象return WxPayNotifyResponse.success("成功");}/*** 查询订单* @param transactionId 微信订单号* @param outTradeNo    商户系统内部的订单号,当没提供transactionId时需要传这个,两个参数二选一即可*/@GetMapping("/wx/par/order/query")public WxPayOrderQueryResult queryOrder(@RequestParam(required = false) String transactionId,@RequestParam(required = false) String outTradeNo)throws WxPayException {return this.wxPayService.queryOrder(transactionId, outTradeNo);}/*** 申请退款* @param request 请求对象*                请求示例(至少包含如下参数):*                {*                  "outRefundNo": "rxx34343121",*                  "outTradeNo": "p22321213009757890",*                  "refundAccount": "REFUND_SOURCE_UNSETTLED_FUNDS",*                  "refundDesc": "退款",*                  "refundFee": 1,*                  "totalFee": 1,*                  "notifyUrl": "http://www.xxxx.com/wx/notify*               }* @return 退款操作结果*/@PostMapping("/wx/refund/order/create")public WxPayRefundResult refund(@RequestBody WxPayRefundRequest request) throws WxPayException {return this.wxPayService.refund(request);}/*** 微信支付-查询退款* 以下四个参数四选一** @param transactionId 微信订单号* @param outTradeNo    商户订单号* @param outRefundNo   商户退款单号* @param refundId      微信退款单号* @return 退款信息*/@GetMapping("/wx/refund/order/query")public WxPayRefundQueryResult refundQuery(@RequestParam(required = false) String transactionId,@RequestParam(required = false) String outTradeNo,@RequestParam(required = false) String outRefundNo,@RequestParam(required = false) String refundId)throws WxPayException {return this.wxPayService.refundQuery(transactionId, outTradeNo, outRefundNo, refundId);}/*** 关闭订单* @param outTradeNo 商户系统内部的订单号*/@GetMapping("/wx/order/close{outTradeNo}")public WxPayOrderCloseResult closeOrder(@PathVariable String outTradeNo) throws WxPayException {return this.wxPayService.closeOrder(outTradeNo);}
}

参考地址:

1,http://www.manongjc.com/article/28970.html

2,https://blog.csdn.net/u014754541/article/details/105964063

支付宝支付

支付宝推出了新的转账接口alipay.fund.trans.uni.transfer(升级后安全性更高,功能更加强大) ,老转账接口alipay.fund.trans.toaccount.transfer将不再维护,新老接口的一个区别就是新接口采用的证书验签方式。

使用新接口要将sdk版本升级到最新版本,博主升级时最新版本是4.10.97。

接下来看集成步骤。

将支付宝开放平台里下载的3个证书放在resources下面

写支付宝支付的配置文件

alipay.properties

alipay.appId=你的应用id
alipay.serverUrl=https://openapi.alipay.com/gateway.do
alipay.privateKey=你的应用私钥
alipay.format=json
alipay.charset=UTF-8
alipay.signType=RSA2
alipay.appCertPath=/cert/appCertPublicKey_2021001164652941.crt
alipay.alipayCertPath=/cert/alipayCertPublicKey_RSA2.crt
alipay.alipayRootCertPath=/cert/alipayRootCert.crt

引入pom依赖

<dependency>
     <groupId>com.alipay.sdk</groupId>
     <artifactId>alipay-sdk-java</artifactId>
     <version>4.10.97.ALL</version>
</dependency>

配置信息注入bean

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;@Component
@PropertySource("classpath:/production/alipay.properties")
@ConfigurationProperties(prefix = "alipay")
@Data
public class AliPayBean {private String appId;private String privateKey;private String publicKey;private String serverUrl;private String domain;private String format;private String charset;private String signType;private String appCertPath;private String alipayCertPath;private String alipayRootCertPath;}

配置类

import com.alipay.api.AlipayClient;
import com.alipay.api.CertAlipayRequest;
import com.alipay.api.DefaultAlipayClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.FileCopyUtils;import java.io.InputStream;@Configuration
public class AliConfig {@Value("${custom.http.proxyHost}")private String proxyHost;@Value("${custom.http.proxyPort}")private int proxyPort;@Value("${spring.profiles.active}")private String activeEnv;@Autowiredprivate AliPayBean aliPayBean;@Bean(name = {"alipayClient"})public AlipayClient alipayClientService() throws Exception{CertAlipayRequest certAlipayRequest = new CertAlipayRequest();//设置网关地址certAlipayRequest.setServerUrl(aliPayBean.getServerUrl());//设置应用IdcertAlipayRequest.setAppId(aliPayBean.getAppId());//设置应用私钥certAlipayRequest.setPrivateKey(aliPayBean.getPrivateKey());//设置请求格式,固定值jsoncertAlipayRequest.setFormat(aliPayBean.getFormat());//设置字符集certAlipayRequest.setCharset(aliPayBean.getCharset());//设置签名类型certAlipayRequest.setSignType(aliPayBean.getSignType());//如果是生产环境或者预演环境,则使用代理模式if ("prod".equals(activeEnv) || "stage".equals(activeEnv) || "test".equals(activeEnv)) {//设置应用公钥证书路径certAlipayRequest.setCertContent(getCertContentByPath(aliPayBean.getAppCertPath()));//设置支付宝公钥证书路径certAlipayRequest.setAlipayPublicCertContent(getCertContentByPath(aliPayBean.getAlipayCertPath()));//设置支付宝根证书路径certAlipayRequest.setRootCertContent(getCertContentByPath(aliPayBean.getAlipayRootCertPath()));certAlipayRequest.setProxyHost(proxyHost);certAlipayRequest.setProxyPort(proxyPort);}else {//localString serverPath = this.getClass().getResource("/").getPath();//设置应用公钥证书路径certAlipayRequest.setCertPath(serverPath+aliPayBean.getAppCertPath());//设置支付宝公钥证书路径certAlipayRequest.setAlipayPublicCertPath(serverPath+aliPayBean.getAlipayCertPath());//设置支付宝根证书路径certAlipayRequest.setRootCertPath(serverPath+aliPayBean.getAlipayRootCertPath());}return new DefaultAlipayClient(certAlipayRequest);}public String getCertContentByPath(String name){InputStream inputStream = null;String content = null;try{inputStream = this.getClass().getClassLoader().getResourceAsStream(name);content = new String(FileCopyUtils.copyToByteArray(inputStream));}catch (Exception e){e.printStackTrace();}return content;}}

支付工具类

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.domain.AlipayTradeQueryModel;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
/*** @description:支付宝工具类* @Date:2020-08-26*/
@Slf4j
@Service
public class AliPayUtils {@Autowired@Qualifier("alipayClient")private AlipayClient alipayClient;/*** 交易查询接口* @param request* @return* @throws Exception*/public boolean isTradeQuery(AlipayTradeQueryModel model) throws AlipayApiException {AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();request.setBizModel(model);AlipayTradeQueryResponse alipayTradeQueryResponse = alipayClient.certificateExecute(request);if(alipayTradeQueryResponse.isSuccess()){return true;} else {return false;}}/*** app支付* @param model* @param notifyUrl* @return* @throws AlipayApiException*/public String startAppPay(AlipayTradeAppPayModel model, String notifyUrl)  throws AlipayApiException {AlipayTradeAppPayRequest aliPayRequest = new AlipayTradeAppPayRequest();model.setProductCode("QUICK_MSECURITY_PAY");aliPayRequest.setNotifyUrl(notifyUrl);aliPayRequest.setBizModel(model);// 这里和普通的接口调用不同,使用的是sdkExecuteAlipayTradeAppPayResponse aliResponse = alipayClient.sdkExecute(aliPayRequest);return aliResponse.getBody();}/*** 转账接口** @param transferParams* @return AlipayFundTransToaccountTransferResponse*/public AlipayFundTransUniTransferResponse doTransferNew(TransferParams transferParams) throws Exception {String title = (StringUtils.isNotBlank(transferParams.getRemark()) ? transferParams.getRemark() : "转账");//转账请求入参AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();//转账参数BizContentForUniTransfer bizContent = new BizContentForUniTransfer();bizContent.setOut_biz_no(transferParams.getOutBizNo());bizContent.setTrans_amount(MathUtil.changeF2Y(Math.abs(Integer.parseInt(transferParams.getAmount()))));bizContent.setProduct_code("TRANS_ACCOUNT_NO_PWD");bizContent.setBiz_scene("DIRECT_TRANSFER");bizContent.setOrder_title(title);Participant participant = new Participant();participant.setIdentity(transferParams.getPayeeAccount());participant.setIdentity_type(transferParams.getPayeeType());participant.setName((StringUtils.isNotBlank(transferParams.getPayeeRealName()) ? transferParams.getPayeeRealName() : StringUtils.EMPTY));bizContent.setPayee_info(participant);bizContent.setRemark(title);request.setBizContent(JSON.toJSONString(bizContent));//转账请求返回AlipayFundTransUniTransferResponse response = null;try {response = alipayClient.certificateExecute(request);} catch (Exception e) {log.info("doTransfer exception,异常信息:{}", e.toString());log.info("doTransfer exception,支付宝返回信息:{}", JSONObject.toJSONString(response));}log.info("doTransfer,AlipayFundTransUniTransferResponse:{}", JSONObject.toJSONString(response));return response;}
}

转账用到的类

@Data
public class TransferParams {/*** 应用编号*/private Long appId;/*** 创建人id*/private Long createdBy;/*** 转账业务订单号*/private String outBizNo;/*** 收款方识别方式*/private String payeeType;/*** 收款方账号,可以是支付宝userId或者支付宝loginId*/private String payeeAccount;/*** 转账金额,单位分*/private String amount;/*** 付款方名称*/private String payerShowName;/*** 收款方名称*/private String payeeRealName;/*** 备注*/private String remark;/*** 支付宝转账流水号*/private String orderId;
}
import java.math.BigDecimal;/*** 支付宝转账参数*/
@Data
public class BizContentForUniTransfer {/*** 业务订单号*/private String out_biz_no;/*** 订单总金额,单位为元,精确到小数点后两位,*/private BigDecimal trans_amount;/*** 业务产品码,* 单笔无密转账到支付宝账户固定为:TRANS_ACCOUNT_NO_PWD;* 单笔无密转账到银行卡固定为:TRANS_BANKCARD_NO_PWD;* 收发现金红包固定为:STD_RED_PACKET;*/private String product_code;/*** 描述特定的业务场景,可传的参数如下:* DIRECT_TRANSFER:单笔无密转账到支付宝/银行卡, B2C现金红包;* PERSONAL_COLLECTION:C2C现金红包-领红包*/private String biz_scene;/*** 转账业务的标题,用于在支付宝用户的账单里显示*/private String order_title;/*** 原支付宝业务单号。C2C现金红包-红包领取时,传红包支付时返回的支付宝单号;* B2C现金红包、单笔无密转账到支付宝/银行卡不需要该参数。*/private String original_order_id;/*** 业务备注*/private String remark;/*** 转账业务请求的扩展参数,支持传入的扩展参数如下:* 1、sub_biz_scene 子业务场景,红包业务必传,取值REDPACKET,C2C现金红包、B2C现金红包均需传入;* 2、withdraw_timeliness为转账到银行卡的预期到账时间,可选(不传入则默认为T1),* 取值T0表示预期T+0到账,取值T1表示预期T+1到账,因到账时效受银行机构处理影响,支付宝无法保证一定是T0或者T1到账;*/private String business_params;/*** 支付收款对象*/private Participant payee_info;
}
@Data
public class Participant {/*** 参与方的唯一标识*/private String identity;/*** 参与方的标识类型,目前支持如下类型:* 1、ALIPAY_USER_ID 支付宝的会员ID* 2、ALIPAY_LOGON_ID:支付宝登录号,支持邮箱和手机号格式*/private String identity_type;/*** 参与方真实姓名,如果非空,将校验收款支付宝账号姓名一致性。* 当identity_type=ALIPAY_LOGON_ID时,本字段必填。*/private String name;
}

原文链接:https://blog.csdn.net/qq_33556185/article/details/110445827

Springboot接入微信支付、支付宝支付相关推荐

  1. 接入微信,支付宝,浦发银行的统一支付方案

    第三方支付统一接入方案 方案背景及目的 目前大部分商户平台均已接入微信,支付宝等第三放支付平台作为支付渠道,每个商户平台开发者都需要自己去接入支付API或SDK,本方案旨在提供一种相对统一的方式,为各 ...

  2. SpringBoot对接微信小程序支付功能开发(一,下单功能)

    1,接入前准备: 接入模式选择直连模式: 申请小程序,得到APPID,并开通微信支付: 申请微信商户号,得到mchid,并绑定APPID: 配置商户API key,下载并配置商户证书,根据微信官方文档 ...

  3. Android Study 之 6分钟妥妥集成微信以及支付宝支付

    LZ-Says:来说俩件事儿: 1.一心只为一人用,一言只为一人说~ 2.今天坐公交,末班车,车上只有司机和我,阴森森的,吓死LZ了...一路小跑!!! 前言 (浪费一分钟) 今天,不讲这个,也不讲那 ...

  4. 微信和支付宝支付模式详解及实现(.Net标准库)

    支付基本上是很多产品都必须的一个模块,大家最熟悉的应该就是微信和支付宝支付了,不过更多的可能还是停留在直接sdk的调用上,甚至和业务系统高度耦合,网上也存在各种解决方案,但大多形式各异,东拼西凑而成. ...

  5. 微信和支付宝支付模式详解及实现(.Net标准库)- OSS开源系列

    2019独角兽企业重金招聘Python工程师标准>>> 支付基本上是很多产品都必须的一个模块,大家最熟悉的应该就是微信和支付宝支付了,不过更多的可能还是停留在直接sdk的调用上,甚至 ...

  6. ASP.NET Core Web 支付功能接入 微信-扫码支付篇

    // 随着版本更迭,新版本可能无法完全适用,请参考仓库内的示例. 这篇文章将介绍ASP.NET Core中使用 开源项目 Payment(https://github.com/Essensoft/Pa ...

  7. 微信,支付宝支付,微信公众号小程序授权等

    微信,支付宝支付,微信公众号小程序授权等 前言 微信支付 微信授权 maven依赖(更新) 前言 最近在公司也做了很多移动端项目,如今微信公众号,小程序又特别火爆,免不了要接触支付,授权这类的业务需求 ...

  8. 微信支付(一)SpringBoot 实现微信扫码支付/Native支付

    SpringBoot 实现微信扫码支付/Native支付 一.背景 在开发一个捐赠项目时须在pc端接入微信扫码支付(Native 扫码支付),在微信端接入微信公众号支付(Jsapi 支付).后端使用的 ...

  9. Android项目内简单集成微信和支付宝支付功能

    最近自己公司的项目需要集成微信和支付宝支付,我是个初学者,然后就开始在网上各种搜索相关Demo.最后找了一个自我感觉还不错的Demo,挺适合初学者使用的.在使用之前一定要在微信平台和蚂蚁金服申请权限, ...

  10. SpringBoot对接微信小程序支付功能开发(二,支付回调功能)

    接着上一篇: SpringBoot对接微信小程序支付功能开发(一,下单功能) 在上一篇下单功能中我们有传支付结果回调地址. 下面是回调接口实现 package com.office.miniapp.c ...

最新文章

  1. Linux内存技术分析(上)
  2. Python Qt GUI设计:QMainWindow、QWidget和QDialog窗口类(基础篇—10)
  3. (转)koogra--Excel文件读取利器
  4. c语言1变A,c语言那些细节之a+1和a+1的区别
  5. html5简单拖拽实现自动左右贴边+幸运大转盘
  6. Docker的使用(三:Docker Hub远程镜像管理)
  7. LeetCode实战:子集
  8. 类型与通用语言运行时
  9. C++确定字符串是否具有唯一字符的算法(附完整源码)
  10. 数值计算 插值与拟合
  11. 分布式认证需求-统一认证授权
  12. web root下放置图片_Apache HTTP存在提权漏洞,威胁共享Web主机安全性
  13. excel日期格式改不了_画进度计划横道图,Excel就够了
  14. 博弈知识汇总(转自Tanky Woo),留着以后复习
  15. python中的或运算_python入门:if语句中的逻辑运算符
  16. 计算机计算累计公式,““请问Excel表格求的合计数为什么和用计算器累加出的合计数不一致...
  17. 10.Python面向对象编程
  18. ubuntu下重装WIN7
  19. C#:实体框架EF(entity framework)
  20. ISP基础(XX):global shutter与rolling shutter

热门文章

  1. maya软件需要计算机配置,【答疑】Maya软件对电脑的配置要求 - 视频教程线上学...
  2. 攻防世界misc 适合作为桌面
  3. 企业,公司职位名称大全(中英文对照)
  4. 最新最好的免费杀毒软件
  5. 9款原型设计工具与Sketch的强强组合,轻松构建交互原型!
  6. libreOffice构建docker镜像
  7. Win10系统Mail添加QQ邮箱
  8. 2021-11-05前端技术栈
  9. Android平台的信息推送实现
  10. 面试必备:什么时候要打破双亲委派机制?什么是双亲委派? (图解+秒懂+史上最全)