3分钟接入支付宝,成功支付一块钱,马云哭了
时间:2022-07-25
本文章向大家介绍3分钟接入支付宝,成功支付一块钱,马云哭了,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文源自 公-众-号 IT老哥 的分享
IT老哥,一个在大厂做高级Java开发的程序员,每天分享技术干货文章
前言
今天老哥带大家接入马爸爸
的支付宝
,成功的支付一块钱,3分钟让你学会,学不会你来打我。
申请沙箱环境支付宝
注册
登录支付宝开发者网站 https://developers.alipay.com/ ,使用个人的支付宝扫码登录后,填写个人信息并提交
沙盒环境设置
打开页面 https://opendocs.alipay.com/open/291/105971 下载公私钥生成工具,安装后生成应用的公钥
和私钥
生成公私钥如下图
将公私钥保存好,后面程序中要用到,同时将公钥复制到沙盒环境的设置中,如下图
保存会生成一个支付宝的公钥,这个公钥用于后续的支付宝支付后的回调验签使用
至此。沙盒环境设置完毕。
部分代码
完整代码请到文章结尾,获取百度云下载链接
// 创建一个订单表
CREATE TABLE `user_order_t` (
`order_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单Id',
`user_id` varchar(64) DEFAULT NULL COMMENT '用户Id',
`order_no` varchar(64) NOT NULL COMMENT '订单号',
`order_amount` decimal(16,4) NOT NULL COMMENT '订单金额',
`order_status` int(11) NOT NULL COMMENT '0 待付款 1 已付款 -1 已取消',
`create_time` varchar(32) NOT NULL COMMENT '创建时间',
`last_update_time` varchar(32) NOT NULL COMMENT '最后修改时间',
PRIMARY KEY (`order_id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4;
/**
* 跳转到下单页面
*/
@RequestMapping("/goPay")
public String goPay() {
return "pay";
}
/**
* 下单,并调用支付宝
*/
@PostMapping("/pay")
public void pay(BigDecimal orderAmount, HttpServletResponse httpResponse) throws Exception {
String payResult = orderService.orderPay(orderAmount);
httpResponse.setContentType("text/html;charset=" + alipayProperties.getCharset());
httpResponse.getWriter().write(payResult);
httpResponse.getWriter().flush();
httpResponse.getWriter().close();
}
/**
* 支付成功的跳转页面
*/
@RequestMapping("/goPaySuccPage")
public String goPaySuccPage() {
return "pay_succ";
}
/**
* 支付成功,支付宝回调这个接口
*/
@ResponseBody
@RequestMapping("/notifyPayResult")
public String notifyPayResult(HttpServletRequest request) {
System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<进入支付宝回调->>>>>>>>>>>>>>>>>>>>>>>>>");
// 1.从支付宝回调的request域中取值放到map中
Map<String, String[]> requestParams = request.getParameterMap();
Map<String, String> params = new HashMap();
for (String name : requestParams.keySet()) {
String[] values = requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
}
params.put(name, valueStr);
}
//2.封装必须参数
// 商户订单号
String outTradeNo = params.get("out_trade_no");
//交易状态
String tradeStatus = params.get("trade_status");
System.out.println("outTradeNo:" + outTradeNo + " tradeStatus:" + tradeStatus);
//3.签名验证(对支付宝返回的数据验证,确定是支付宝返回的)
boolean signVerified = false;
try {
//3.1调用SDK验证签名
signVerified = AlipaySignature.rsaCheckV1(params, alipayProperties.getPublicKey(), alipayProperties.getCharset(), alipayProperties.getSignType());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("--------------->验签结果:" + signVerified);
//4.对验签进行处理
if (signVerified) {
//验签通过
//只处理支付成功的订单: 修改交易表状态,支付成功
if ("TRADE_FINISHED".equals(tradeStatus) || "TRADE_SUCCESS".equals(tradeStatus)) {
//根据订单号查找订单,防止多次回调的问题
UserOrder orderByOrder = orderService.getOrderByOrderNo(outTradeNo);
if (orderByOrder != null && orderByOrder.getOrderStatus() == OrderEnum.ORDER_STATUS_NOT_PAY.getStatus()) {
//修改订单状态
orderByOrder.setOrderStatus(OrderEnum.ORDER_STATUS_PAID.getStatus());
orderByOrder.setLastUpdateTime(DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
orderService.updateOrder(orderByOrder);
}
return "success";
} else {
return "failure";
}
} else {
//验签不通过
System.err.println("-------------------->验签失败");
return "failure";
}
}
支付宝配置文件
# 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
appId:
# 商户私钥,您的PKCS8格式RSA2私钥
privateKey:
# 支付宝公钥,不是应用公钥 查看地址:https://openhome.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
publicKey:
# 服务器异步通知页面路径需http://格式的完整路径,
#不能加?id=123这类自定义参数,这个要公网才能器起效果
notifyUrl:http://localhost:10086/order/notifyPayResult
# 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数
returnUrl:http://localhost:10086/order/goPaySuccPage
# 签名方式
signType:RSA2
# 字符编码格式
charset:utf-8
# 支付宝网关
gatewayUrl:https://openapi.alipaydev.com/gateway.do
# 日志路径
logPath:"d:\data\"
支付一块钱
下载沙箱环境的支付宝
登录支付宝
访问支付页面,进行支付
到此为止,我们就成功的支付了一块钱,鼓掌!!!
云服务器,云硬盘,数据库(包括MySQL、Redis、MongoDB、SQL Server),CDN流量包,短信流量包,cos资源包,消息队列ckafka,点播资源包,实时音视频套餐,网站管家(WAF),大禹BGP高防(包含高防包及高防IP),云解析,SSL证书,手游安全MTP,移动应用安全、 云直播等等。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法