java充值_Java实现支付宝充值
支付宝SDK依赖
com.alipay.sdk
alipay-sdk-java
3.3.4.ALL
支付宝参数配置类
@Component
@Configuration
public class AliDevPayConfig implements Serializable {
/**
* 支付宝服务器主动通知商户服务器里指定的页面http/https路径
* 异步请求,地址必须是公网可以访问的才行,不能有任何参数
* 例如:项目发布地址/本项目名/接口名
*/
public static String NOTIFY_URL;
public static String RETURN_URL;
@Value("${alipay.aliPayReturnUrl}")
public void setReturnUrl(String returnUrl) {
RETURN_URL = returnUrl;
}
@Value("${alipay.aliPayNotifyUrl}")
public void setNotifyUrl(String notifyUrl) {
NOTIFY_URL = notifyUrl;
}
public String getNotifyUrl() {
return NOTIFY_URL;
}
public String getReturnUrl() {
return RETURN_URL;
}
/**支付宝分配给开发者的应用ID*/
public static String aliPayAppId = "开发者id";
/**支付宝网关*/
public static String aliPayGateWay = "https://openapi.alipay.com/gateway.do";
/**私钥*/
public static String aliPayPrivateKey = "你的私钥";
/**支付宝公钥*/
public static String aliPayPublicKey = "你的公钥";
/**仅支持JSON*/
public static String FORMAT = "JSON";
/**请求使用的编码格式,如utf-8,gbk,gb2312等*/
public static String CHARSET = "utf-8";
/**商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2*/
public static String SIGN_TYPE = "RSA2";
}
因为我的项目有多个环境,会有多个对应的配置文件,所以我选择用@Value注入的方式。
配置文件的url配置如下:
alipay:
aliPayNotifyUrl: 异步回调url
aliPayReturnUrl: 同步回调url
Controller
@Resource
PayService payService;
@RequestMapping(value = "/ali", method = RequestMethod.POST)
@ApiOperation(value="[支付宝]充值")
public Result alipayTopup(@RequestBody AliPayRechargeDTO aliPayRechargeDTO){
return Result.getSuccess(payService.saveAliPayRechangeBill(aliPayRechargeDTO));
}
@RequestMapping(value = "/alipaynotice", method = RequestMethod.POST)
@ApiOperation(value="[支付宝专用]支付宝充值接口异步回调接口")
public String paynotice(HttpServletRequest request){
return payService.alipayNotify(request);
}
DTO对象传入你所需要的参数,比如金额,账户id等等。
Service
@Slf4j
@Service
public class PayService{
public String saveAliPayRechangeBill(AliPayRechargeDTO rechargeDTO){
BigDecimal totalAmount = rechargeDTO.getRechargeTotalAmount();
//实例化客户端(参数:网关地址、商户appid、商户私钥、格式、编码、支付宝公钥、加密类型),为了取得预付订单信息
AlipayClient alipayClient = new DefaultAlipayClient(AliDevPayConfig.aliPayGateWay, AliDevPayConfig.aliPayAppId,
AliDevPayConfig.aliPayPrivateKey, AliDevPayConfig.FORMAT, AliDevPayConfig.CHARSET,
AliDevPayConfig.aliPayPublicKey, AliDevPayConfig.SIGN_TYPE);
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest ali_request = new AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
//对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。
model.setBody("xx商品介绍");
//商品名称
model.setSubject("xx商品");
//商户订单号(根据业务需求自己生成)
model.setOutTradeNo("你自己业务账单的id");
//交易超时时间 这里的30m就是30分钟
model.setTimeoutExpress("30m");
//支付金额 后面保留2位小数点..不能超过2位
model.setTotalAmount(totalAmount.toString());
//销售产品码(固定值)
model.setProductCode("QUICK_MSECURITY_PAY");
ali_request.setBizModel(model);
//异步回调地址(后台)
ali_request.setNotifyUrl(AliDevPayConfig.NOTIFY_URL);
log.info("Alipay异步通知的地址为:" + ali_request.getNotifyUrl());
try{
// 这里和普通的接口调用不同,使用的是sdkExecute
//返回支付宝订单信息(预处理)
AlipayTradeAppPayResponse alipayTradeAppPayResponse = alipayClient.sdkExecute(ali_request);
//就是orderString 可以直接给APP请求,无需再做处理。
String alipayTransferId = alipayTradeAppPayResponse.getBody();
log.info("需要返回给支付宝的数据 alipayTransferId:" + alipayTransferId);
return alipayTransferId;
}catch (AlipayApiException e){
e.printStackTrace();
}
return null;
}
public String alipayNotify(HttpServletRequest request) {
log.info("支付宝异步返回支付结果开始");
//1.从支付宝回调的request域中取值
//获取支付宝返回的参数集合
Map aliParams = request.getParameterMap();
log.info("支付宝Post过来的反馈信息:" + aliParams.toString());
//用以存放转化后的参数集合
Map conversionParams = new HashMap();
for (Iterator iter = aliParams.keySet().iterator(); iter.hasNext();) {
String key = iter.next();
String[] values = aliParams.get(key);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
}
// 乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "UTF-8");
conversionParams.put(key, valueStr);
}
log.info("支付宝返回参数集合:"+conversionParams);
String status=aliPayCheck(conversionParams);
return status;
}
public String aliPayCheck(Map conversionParams){
log.info("=支付宝异步请求逻辑处理=");
//签名验证(对支付宝返回的数据验证,确定是支付宝返回的)
boolean signVerified = false;
try {
//调用SDK验证签名
String alipayPublicKey = AliDevPayConfig.aliPayPublicKey;
String charset = AliDevPayConfig.CHARSET;
String signType = AliDevPayConfig.SIGN_TYPE;
signVerified = AlipaySignature.rsaCheckV1(conversionParams, alipayPublicKey, charset, signType);
//对验签进行处理.
if (signVerified) {
log.info("+++++++++++支付宝回调签名认证成功+++++++++++");
// 按照支付结果异步通知中的描述,对支付结果中的业务内容进行1\2\3\4二次校验,校验成功后在response中返回success,校验失败返回failure 支付宝官方建议校验的值(out_trade_no、total_amount、sellerId、app_id)
//验签通过 获取交易状态
String tradeStatus = (String)conversionParams.get("trade_status");
//只处理支付成功的订单: 修改交易表状态,支付成功
//只有交易通知状态为TRADE_SUCCESS或TRADE_FINISHED时,支付宝才会认定为买家付款成功。
if (tradeStatus.equals("TRADE_SUCCESS") ||tradeStatus.equals("TRADE_FINISHED")) {
//TODO 获取支付宝通知完成充值后续业务
//交易成功 获取商户账单id
String billId = (String) conversionParams.get("out_trade_no");
//支付宝交易流水号
String ali_pay_no = (String) conversionParams.get("trade_no");
//TODO 修改业务订单信息
//TODO 余额到账,消息推送
return "success";
} else {
return "fail";
}
}else{ //验签不通过
log.info("++验签不通过 !++");
return "fail";
}
} catch (AlipayApiException e) {
log.info("+++验签失败 !+++");
e.printStackTrace();
}
return "fail";
}
}
以上saveAliPayRechangeBill方法返回的类型如下
app_id=2015052600090779&biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22seller_id%22%3A%22%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%22IQJZSRC1YMQB5HU%22%7D&charset=utf-8&format=json&method=alipay.trade.app.pay¬ify_url=http%3A%2F%2Fdomain.merchant.com%2Fpayment_notify&sign_type=RSA2×tamp=2016-08-25%2020%3A26%3A31&version=1.0&sign=cYmuUnKi5QdBsoZEAbMXVMmRWjsuUj%2By48A2DvWAVVBuYkiBj13CFDHu2vZQvmOfkjE0YqCUQE04kqm9Xg3tIX8tPeIGIFtsIyp%2FM45w1ZsDOiduBbduGfRo1XRsvAyVAv2hCrBLLrDI5Vi7uZZ77Lo5J0PpUUWwyQGt0M4cj8g%3D
以上结果等价于如下,但上面才是正常的返回结果。
body="test"&_input_charset="UTF-8"&it_b_pay="1d"&total_fee="1"&subject="test"¬ify_url="http://www.bejson.com/api/alipay/testpayotify.php"&service="mobile.securitypay.pay"&seller_id="cw@bejson.com"&partner="2088301"&out_trade_no="2088301971894011"&payment_type="1"&show_url="http://www.dcloud.io/helloh5/"&sign="RtUKAGMfelb5sl2az4YKhxst051l94FSkpk9xoD91Hbpr2PKnWjHIafTWqNLyxGibde%2BKwcq9Y8cDN0qU%2FsO6hXjch0B4GaMJHBxZQM%2FnJK2YGxPPOWFKKL5rBKVJ%2BrX4OImfSQIyKKUpAEFG6uFfek2hh%2FPFJSXk2Phvmrb8U%3D"&sign_type="RSA"
调用时,请核对所有支付宝所必要的参数,参考支付宝参数
至此就已经差不多完成支付宝的接入了,如果有其他问题可以百度或者留言,如果有什么错误,欢迎多多指正批评。:)
java充值_Java实现支付宝充值相关推荐
- 支付宝sdk java对接_java后台支付宝app支付调用sdk进行支付
支付宝sdk 创建一个支付宝的util类 public class AlipayUtil { public static final String APP_ID = "20160911004 ...
- p2p金融项目+支付宝充值
目录 前言 下载服务端SDK 时序图: 按照支付宝时序图的过程去做: 第一步: 第二步--2:生成充值记录(状态:充值中) 第四步:调支付宝的支付接口 第七+八步:(7)get请求returnURL, ...
- p2p银行充值功能模块 支付宝调用
银行充值简介 用户要想要投标的话,那么需要往p2p平台上进行充值 使用支付宝沙箱 调用支付宝充值接口进行测试 用户余额页面展示用户的余额 点击充值调用跳转到银行充值页面 输入密码,密码正确调转到支付宝 ...
- discuz网站没备案无执照接入支付宝充值功能
discuz个人网站没备案无执照接入支付宝充值功能 文章目录 事情是这样的 一.支付宝当面付是什么? 二.如何申请当面付接口 1.登录 支付宝商家中心 2.点击"产品中心",支付产 ...
- Django对接支付宝实现支付宝充值金币功能示例
很多网站里都有金币.积分之类的虚拟货币,获取这些往往需要充值.那么问题来了,如何在Django中对接支付宝实现支付宝充值金币的功能呢?网上很多资料都是电商的,那些都会带有订单系统之类比较复杂,而充值金 ...
- android 类似充值界面,Android学习之RecylerView实习仿支付宝充值界面
今天周末,闲来无事,做了一个仿支付宝充值界面,主要知识点用RecylerView的GridlayoutManager布局管理器,实现不同数据类型,填充不同布局,功能包括单击选中,双击取消,支持可输入金 ...
- Django对接支付宝实现支付宝充值金币功能
很多网站里都有金币.积分之类的虚拟货币,获取这些往往需要充值.那么问题来了,如何在Django中对接支付宝实现支付宝充值金币的功能呢?网上很多资料都是电商的,那些都会带有订单系统之类比较复杂,而充值金 ...
- android 调用支付宝充值,提示系统繁忙,4000
今天在做支付宝充值的时候,遇到一个问题,如下图: 找了老半天的错误,没有找到错误在哪里了,上网半天也没有找到与之相关的错误,最后还是请教了一个大神,才知道错误的原因,代码,是没有任何错误的,错误在于, ...
- 【技术贴】解决支付宝充值信用卡还款跳转到网上银行报错Error 404 - Not Found
声明 : 本文在 GFDL 1.2 下发布,本文出处 光大银行信用卡 http://bbs.090989.com/forum-186-1.html http://androidgao.blogspo ...
最新文章
- 我竟然用OpenCV实现了卡尔曼滤波
- java与fabric区块链--fabric-java-jdk部署搭建--(1)
- redis stream持久化_Beetlex.Redis之Stream功能详解
- 什么是802.11G协议
- 北京招聘 | 百度智能生活事业群组小度科技招聘对话系统算法实习生、工程师...
- 重学TCP协议(11)TFO(Tcp Fast Open)
- dataframe存到mysql中_pandas实现to_sql将DataFrame保存到数据库中
- c语言鼠标环绕特效,C语言写的鼠标有残影,急需解决方案,在线等待!
- Linux 常用命令大放送
- 大型油烟机清洗机器人_大型油烟机清洗机
- LabView学习笔记(六):while循环与for循环
- 为你的.NET/Mono应用程序加入更新支持NetSparkle
- GNS3 中使用 Docker 容器
- Invest授粉模型问题求助
- 有什么优质的计算机专业书籍?操作系统、计算机网络、计算机组成、数据结构、数据库.....
- matlab 实现排序
- 飞秒激光制备量子计算机,制备出世界最大规模光量子计算芯片
- ElasticSearch配合mysql实现同义词热更新
- 孙氏太极拳--无极桩
- 《阿里云服务器教程2》:如何远程连接linux系统阿里云服务器ECS
热门文章
- 为什么说vivo Pad 是学习办公的生产力利器
- 鸿蒙OS2面世,一本书了解“现代操作系统”!
- 于娟《生命日记》——复旦大学教师于娟对大学生健康的建议
- ubuntu16.04安装AnyDesk
- 计蒜客T1233 书架
- 【HEC-RAS】01 应用简介
- MIPI CSI调试之 raw 数据格式
- 传音控股第三季营收129亿:净利6亿 同比降47.42%
- Ultralytics公司YOLOv8来了(训练自己的数据集并基于NVIDIA TensorRT和华为昇腾端到端模型加速)--跟不上“卷“的节奏
- avi格式转换器官方下载