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,移动应用安全、 云直播等等。