前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3分钟接入支付宝,成功支付一块钱,马云哭了

3分钟接入支付宝,成功支付一块钱,马云哭了

作者头像
公众号 IT老哥
修改2020-09-21 15:44:05
7890
修改2020-09-21 15:44:05
举报
文章被收录于专栏:用户7621540的专栏

本文源自 公-众-号 IT老哥 的分享

IT老哥,一个在大厂做高级Java开发的程序员,每天分享技术干货文章

前言

今天老哥带大家接入马爸爸支付宝,成功的支付一块钱,3分钟让你学会,学不会你来打我。

申请沙箱环境支付宝

注册

登录支付宝开发者网站 https://developers.alipay.com/ ,使用个人的支付宝扫码登录后,填写个人信息并提交

沙盒环境设置

打开页面 https://opendocs.alipay.com/open/291/105971 下载公私钥生成工具,安装后生成应用的公钥私钥

生成公私钥如下图

将公私钥保存好,后面程序中要用到,同时将公钥复制到沙盒环境的设置中,如下图

保存会生成一个支付宝的公钥,这个公钥用于后续的支付宝支付后的回调验签使用

至此。沙盒环境设置完毕。

部分代码

完整代码请到文章结尾,获取百度云下载链接

代码语言:javascript
复制
// 创建一个订单表
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;
代码语言:javascript
复制
/**
 * 跳转到下单页面
 */
@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";
    }
}

支付宝配置文件

代码语言:javascript
复制
# 应用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移动应用安全云直播等等。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT老哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本文源自 公-众-号 IT老哥 的分享
  • 前言
  • 申请沙箱环境支付宝
    • 注册
      • 沙盒环境设置
        • 生成公私钥如下图
    • 部分代码
    • 支付一块钱
      • 下载沙箱环境的支付宝
        • 登录支付宝
          • 访问支付页面,进行支付
          相关产品与服务
          云服务器
          云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档