支付宝手机网站支付接入(沙箱环境)

这篇具有很好参考价值的文章主要介绍了支付宝手机网站支付接入(沙箱环境)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考阿里云文档:https://docs.open.alipay.com/203/105285/

1.调用流程

手机网站支付产品包含两类API:

  • 页面跳转类:需要从前端页面以Form表单的形式发起请求,浏览器会自动跳转至支付宝的相关页面(一般是收银台或签约页面),用户在该页面完成相关业务操作后再回跳到商户指定页面。例如本产品中的手机网站支付接口alipay.trade.wap.pay。
  • 系统调用类:直接从服务端发起HTTP请求,支付宝会同步返回请求结果。例如本产品中的交易查询等配套API。
    调用流程:
    支付宝手机网站支付接入(沙箱环境)
  • 如上图所示,用户在商户的H5网站下单支付后,商户系统按照手机网站支付接口alipay.trade.wap.payAPI的参数规范生成订单数据,然后在前端页面通过Form表单的形式请求到支付宝。此时支付宝会自动将页面跳转至支付宝H5收银台页面,如果用户手机上安装了支付宝APP,则自动唤起支付宝APP。开发者需要关注安装了支付宝和未安装支付宝的两种测试场景,对于在手机浏览器唤起H5页面的模式下,如果安装了支付宝却没有唤起,大部分原因是当前浏览器不在支付宝配置的白名单内。
  • 对于商户app内嵌webview中的支付场景,建议集成支付宝App支付产品。或者您可以使用手机网站支付转Native支付的方案,不建议在您的APP中直接接入手机网站支付。
  • 用户在支付宝APP或H5收银台完成支付后,会根据商户在手机网站支付API中传入的前台回跳地址return_url自动跳转回商户页面,同时在URL请求中以Query String的形式附带上支付结果参数,详细回跳参数见“手机网站支付接口alipay.trade.wap.pay”前台回跳参数。

注意:在ios系统中,唤起支付宝App支付完成后,不会自动回到浏览器或商户APP。用户可手工切回到浏览器或商户APP;支付宝H5收银台会自动跳转回商户return_url指定的页面。

  • 支付宝还会根据原始支付API中传入的异步通知地址notify_url,通过POST请求的形式将支付结果作为参数通知到商户系统,详情见支付结果异步通知。
  • 除了正向支付流程外,支付宝也提供交易查询、关闭、退款、退款查询以及对账等配套API。

特别注意:

  • 由于前台回跳的不可靠性,前台回跳只能作为商户支付结果页的入口,最终支付结果必须以异步通知或查询接口返回为准,不能依赖前台回跳。
  • 商户系统接收到异步通知以后,必须通过验签(验证通知中的sign参数)来确保支付通知是由支付宝发送的。详细验签规则参考异步通知验签。
  • 接受到异步通知并验签通过后,一定要检查通知内容,包括通知中的app_id, out_trade_no, total_amount是否与请求中的一致,并根据trade_status进行后续业务处理

2.环境接入

2.1SDK包下载:

<dependency>
  <groupId>com.alipay.sdk</groupId>
  <artifactId>alipay-sdk-java</artifactId>
  <version>4.3.0.ALL</version>
</dependency>

2.2公私钥文件配置

支付宝手机网站支付接入(沙箱环境)
支付宝手机网站支付接入(沙箱环境)

3.沙箱测试

沙箱环境提供测试账户:买家账号,商户账户。可自行充值

3.1java后端发送支付请求:

@RequestMapping("/pay")
public void pay(HttpServletResponse response, String amount) {
   String form = null;
   try {
       form = PayUtil.pay(amount);
   } catch (AlipayApiException e) {
       form = "pay error!";
       e.printStackTrace();
   }
   response.setContentType("text/html;charset=" + "utf-8");
   try {
       response.getWriter().write(form);//直接将完整的表单html输出到页面
       response.getWriter().flush();
       response.getWriter().close();
   } catch (IOException e) {
       e.printStackTrace();
   }

}

public static String pay(String amount) throws AlipayApiException {
   AlipayClient alipay_client = new DefaultAlipayClient(server_url, app_id, private_key, format, charset,   alipay_pubic_key, sign_type);
   AlipayTradeWapPayRequest alipay_request = new AlipayTradeWapPayRequest();
   AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
   model.setOutTradeNo(getOutOrderNo());
   model.setSubject(subject);
   model.setTotalAmount(amount);
   model.setTimeoutExpress(timeout_express);
   model.setProductCode(product_code);
   alipay_request.setBizModel(model);
   // 设置异步通知地址
   alipay_request.setNotifyUrl(notify_url);
   // 设置同步地址
   alipay_request.setReturnUrl(return_url);

   // 调用SDK生成表单
   AlipayResponse alipay_response = alipay_client.pageExecute(alipay_request);
   String form = alipay_response.getBody();
   System.out.println(alipay_response.isSuccess() + ":" + form);
   return form;

}

后端向支付宝发送支付请求,SDK将根据私钥内容对请求进行签名,支付宝根据提前配置的公钥进行验签通过后响应。返回的字符内容前端以H5的形式展示,依据内容来看form表单自动提交至支付宝付款界面。登录之前的沙箱买家账户进行支付即可。

3.2支付回调接口和 结果页面回调接口

@RequestMapping("/notify")
public void alipayNotify(HttpServletRequest request, HttpServletResponse response) throws IOException {

   PrintWriter writer = response.getWriter();
   //获取支付宝POST过来反馈信息
   Map<String, String> params = new HashMap<String, String>();
   Map requestParams = request.getParameterMap();
   for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
       String name = (String) iter.next();
       String[] values = (String[]) requestParams.get(name);
       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"), "gbk");
       params.put(name, valueStr);
   }
   //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//

   String out_trade_no = "";
   String trade_no = "";
   String trade_status = "";

   try {
       //商户订单号

       out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");

       //支付宝交易号

       trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");

       //交易状态
       trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");

   } catch (UnsupportedEncodingException e) {
       e.printStackTrace();
   }

   //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
   //计算得出通知验证结果
   //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
   boolean verify_result = false;
   try {
       verify_result = AlipaySignature.rsaCheckV1(params, PayUtil.alipay_pubic_key, PayUtil.charset, "RSA2");
   } catch (AlipayApiException e) {
       e.printStackTrace();
   }

   if (verify_result) {//验证成功
       //////////////////////////////////////////////////////////////////////////////////////////
       //请在这里加上商户的业务逻辑程序代码
       System.out.println("商户的业务逻辑程序代码-notify:" + out_trade_no + " trade_status:" + trade_status);

       //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——

       if (trade_status.equals("TRADE_FINISHED")) {
           //判断该笔订单是否在商户网站中已经做过处理
           //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
           //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
           //如果有做过处理,不执行商户的业务程序
           System.out.println("TRADE_FINISHED");
           //注意:
           //如果签约的是可退款协议,退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
           //如果没有签约可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。
       } else if (trade_status.equals("TRADE_SUCCESS")) {
           //判断该笔订单是否在商户网站中已经做过处理
           //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
           //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
           //如果有做过处理,不执行商户的业务程序
           System.out.println("TRADE_SUCCESS");
           //注意:
           //如果签约的是可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。
       }

       //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
       //writer.clear();
       writer.println("success");    //请不要修改或删除

       //////////////////////////////////////////////////////////////////////////////////////////
   } else {//验证失败
       writer.println("fail");
   }
}

支付回调时,首先进行验签操作,验证成功后根据提供的订单号,支付状态做相应的业务处理。

@RequestMapping("/returnUrl")
public void alipayReturn(HttpServletRequest request, HttpServletResponse response) throws IOException {
    PrintWriter writer = response.getWriter();
    //获取支付宝GET过来反馈信息
    Map<String, String> params = new HashMap<String, String>();
    Map requestParams = request.getParameterMap();
    for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
        String name = (String) iter.next();
        String[] values = (String[]) requestParams.get(name);
        String valueStr = "";
        for (int i = 0; i < values.length; i++) {
            valueStr = (i == values.length - 1) ? valueStr + values[i]
                    : valueStr + values[i] + ",";
        }
        //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
        try {
            valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        params.put(name, valueStr);
    }


    String out_trade_no = "";
    String trade_no = "";
    try {
        //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
        //商户订单号
        out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");

        //支付宝交易号
        trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    System.out.println("商户的业务逻辑程序代码-return_url:" + out_trade_no);

    //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
    //计算得出通知验证结果
    //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
    boolean verify_result = false;
    try {
        verify_result = AlipaySignature.rsaCheckV1(params, PayUtil.alipay_pubic_key, PayUtil.charset, "RSA2");
    } catch (AlipayApiException e) {
        e.printStackTrace();
    }

    if (verify_result) {//验证成功
        //////////////////////////////////////////////////////////////////////////////////////////
        //请在这里加上商户的业务逻辑程序代码

        //该页面可做页面美工编辑
        //out.clear();
        writer.println("check success<br />");
        //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——

        //////////////////////////////////////////////////////////////////////////////////////////
    } else {
        //该页面可做页面美工编辑
        //out.clear();
        writer.println("check fail");
    }
}

结果页面回调时,首先进行验签操作,验证成功后根据提供的订单号,做相应的业务处理,并可以控制跳转的结果页面。文章来源地址https://www.toymoban.com/news/detail-711220.html

到了这里,关于支付宝手机网站支付接入(沙箱环境)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • spring boot支付宝沙箱环境测试支付功能

    目录 一、安装支付宝支付demo 二、配置demo信息 三、配置回调地址和异步地址 四、内网穿透 (一)简介 (二)使用场景 (三)内网穿透的几个常用软件 (四)使用natapp 选择Java版本,下载后是一个eclipse项目 SDK Demo 获取 - 支付宝文档中心 (alipay.com) 导入ideal参考:IDEA导入Ec

    2024年01月17日
    浏览(35)
  • 公网环境调试本地配置的Java支付宝沙箱环境模拟支付场景

    在沙箱环境调试支付SDK的时候,往往沙箱环境部署在本地,局限性大,在沙箱环境中有多种支付场景,往往是多人联合开发,本地环境可能无法满足异地联合,所以把本地环境变成公网环境下进行调试开发会更好。 本次教程,我们将使用支付宝平台提供的沙箱环境,在本地配

    2024年01月22日
    浏览(44)
  • Java实现支付宝沙箱环境支付,SDK接口远程调试

    转发自cpolar内网穿透的文章:Java支付宝沙箱环境支付,SDK接口远程调试【内网穿透】 Maven Spring boot Jdk 1.8 获取支付宝支付Java SDK,maven项目可以选择maven版本,普通java项目可以在GitHub下载,这里以maven为例 SDK下载地址:https://doc.open.alipay.com/docs/doc.htm?treeId=193articleId=103419docType=1 选择

    2024年02月06日
    浏览(39)
  • Java开发者必备:支付宝沙箱环境支付远程调试指南

    🔥 博客主页 : 小羊失眠啦. 🔖 系列专栏 : C语言 、 Linux 、 Cpolar ❤️ 感谢大家点赞👍收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 在沙箱环境调试支付SDK的时候,往往沙箱环境部署在本地

    2024年02月08日
    浏览(35)
  • Spring Boot 整合支付宝实现在线支付方案(沙箱环境)

    TIP:对于许多个人开发者而言,实现支付宝支付功能在以往往往意味着需要跨越复杂的商业流程。这涉及到拥有自己的网站及其备案,以及提交营业执照等一系列文档。但现在,支付宝开放平台带来了突破性的便利——通过沙箱环境,个人仅需拥有支付宝账号,就能够测试并

    2024年01月16日
    浏览(35)
  • Java支付宝沙箱环境支付,SDK接口远程调试【内网穿透】

    转发自CSDN远程穿透的文章:Java支付宝沙箱环境支付,SDK接口远程调试【内网穿透】 Maven Spring boot Jdk 1.8 获取支付宝支付Java SDK,maven项目可以选择maven版本,普通java项目可以在GitHub下载,这里以maven为例 SDK下载地址:https://doc.open.alipay.com/docs/doc.htm?treeId=193articleId=103419docType=1  选择

    2024年02月02日
    浏览(39)
  • Java支付SDK接口远程调试 - 支付宝沙箱环境【公网地址调试】

    转发自CSDN远程穿透的文章:Java支付宝沙箱环境支付,SDK接口远程调试【内网穿透】 Maven Spring boot Jdk 1.8 获取支付宝支付Java SDK,maven项目可以选择maven版本,普通java项目可以在GitHub下载,这里以maven为例 SDK下载地址:https://doc.open.alipay.com/docs/doc.htm?treeId=193articleId=103419docType=1 选择

    2023年04月18日
    浏览(33)
  • 支付宝沙箱环境+SpringBoot+内网穿透整合开发

    目录 1.查看沙箱账号 2.内网穿透 3.沙箱环境整合SpringBoot开发 下面我将以实际案例详细介绍如何使用沙箱环境进行支付宝支付对接的开发 1.查看沙箱账号  首先什么是沙箱账号? 沙箱账号是指在支付宝沙箱环境中创建的测试账户,用于模拟真实的支付流程。在开发和测试过程

    2023年04月15日
    浏览(29)
  • 本地配置Java支付宝沙箱环境模拟支付并内网穿透远程调试

    在沙箱环境调试支付SDK的时候,往往沙箱环境部署在本地,局限性大,在沙箱环境中有多种支付场景,往往是多人联合开发,本地环境可能无法满足异地联合,所以把本地环境变成公网环境下进行调试开发会更好。 本次教程,我们将使用支付宝平台提供的沙箱环境,在本地配

    2024年02月04日
    浏览(33)
  • 如何使用Java支付宝沙箱环境并公网调用sdk创建支付单服

    1.测试环境 Maven Spring boot Jdk 1.8 2.本地配置 获取支付宝支付Java SDK,maven项目可以选择maven版本,普通java项目可以在GitHub下载,这里以maven为例 SDK下载地址:https://doc.open.alipay.com/docs/doc.htm?treeId=193articleId=103419docType=1 选择最新版的SDK版本 复制maven坐标,导入spring boot项目pom 文件里面

    2024年01月22日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包