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