支付宝支付-支付宝PC端扫码支付

前言

支付宝支付—沙箱环境使用
支付宝支付-支付宝PC端扫码支付「本文
支付宝支付-手机浏览器H5支付「待写

PC端扫码支付,其实就是就是 电脑网站支付,本文基于支付宝沙箱环境,不了解的可以看一下上边的链接。

废话不多说,直接进入主题。

下载运行测试Demo

官方Demo下载链接:电脑网站支付(Java)

下载后导入 IDEA 中运行如下图所示:

如果在导入运行过程遇到错误,请参考这篇文章:IDEA中导入支付宝电脑网站支付测试Demo遇到的错误

进行支付测试,注意付款要用沙箱环境提供的支付宝APK

Maven项目中使用

pom.xml中引入支付宝sdk依赖

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

配置可以单独创建一个类,静态初始化参数:

public class AlipayConfig {

    // [沙箱环境]应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号    public static String app_id = "";

    // [沙箱环境]商户私钥,您的PKCS8格式RSA2私钥    public static String merchant_private_key = "";

    // [沙箱环境]支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。    public static String alipay_public_key = "";

    // [沙箱环境]服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问    public static String notify_url = "http://ngrok.sscai.club/alipay/aliPayNotify_url";

    // [沙箱环境]页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问    public static String return_url = "http://ngrok.sscai.club/index.html#/alipay/success";

    // [沙箱环境]    public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";}

至于接口啥的基本就是可以参考上方运行的Demo了。

简单看看生成支付宝订单「没有使用开源SDK」。

@Transactionalpublic String alipayOrder(AlipayOrderRequest alipayOrderRequest) throws AlipayApiException {

    //获得初始化的AlipayClient    AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl,            AlipayConfig.app_id,            AlipayConfig.merchant_private_key,            "json",            AlipayConfig.charset,            AlipayConfig.alipay_public_key,            AlipayConfig.sign_type);

    //设置请求参数    String payType = alipayOrderRequest.getPayType();

    // page    AlipayTradePagePayRequest alipayPageRequest = new AlipayTradePagePayRequest();    alipayPageRequest.setReturnUrl(AlipayConfig.return_url);    alipayPageRequest.setNotifyUrl(AlipayConfig.notify_url);

    //商户订单号,商户网站订单系统中唯一订单号,必填    String out_trade_no = alipayOrderRequest.getWidOutTradeNo();    //付款金额,必填    String total_amount = alipayOrderRequest.getWidTotalFee();    //订单名称,必填    String subject = alipayOrderRequest.getWidSubject();    //商品描述,可空    String body = alipayOrderRequest.getWIDbody();

    //拼接参数    alipayPageRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","            + "\"total_amount\":\""+ total_amount +"\","            + "\"subject\":\""+ subject +"\","            + "\"body\":\""+ body +"\","            + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

    // 发起请求    return alipayClient.pageExecute(alipayPageRequest).getBody();}

网站支付接口调用后返回的是一个 Form 表单,也就是 result 实际是一段 Html 代码,然后把 result 传给前段调用即可,下面是返回的 Form 的一个示例:

  <form name="punchout_form" method="post" action="https://openapi.alipaydev.com/gateway.do?charset=UTF-8&amp;method=alipay.trade.wap.pay&amp;sign=xx&amp;return_url=http%3A%2F%2Fngrok.sscai.club%2Falipay_trade_wap_pay_java_utf_8_war_exploded%2Freturn_url.jsp&amp;notify_url=http%3A%2F%2Fngrok.sscai.club%2Falipay_trade_wap_pay_java_utf_8_war_exploded%2Fnotify_url.jsp&amp;version=1.0&amp;app_id=2016101700705301&amp;sign_type=RSA2&amp;timestamp=2020-01-08+14%3A09%3A58&amp;alipay_sdk=alipay-sdk-java-3.3.0&amp;format=json">    <input type="hidden" name="biz_content" value="{&quot;body&quot;:&quot;购买测试商品0.01元&quot;,&quot;out_trade_no&quot;:&quot;20201814955421&quot;,&quot;product_code&quot;:&quot;QUICK_WAP_WAY&quot;,&quot;subject&quot;:&quot;电脑网站支付测试商品&quot;,&quot;timeout_express&quot;:&quot;2m&quot;,&quot;total_amount&quot;:&quot;0.01&quot;}" />    <input type="submit" value="立即支付" style="display:none" />   </form>

怎么调用呢?下面是一段我在vue中的测试代码片段,前段接收到后端返回的 Form 表单进行提交:

const div = document.createElement(‘div‘);console.log("我是后端返回的数据:"+res.result)div.innerHTML = res.result;document.body.appendChild(div);console.log("punchout_form:"+document.forms.punchout_form)document.forms.punchout_form.submit();

支付成功后会自动重定向到配置的跳转界面,由后端的的 return_url 参数控制。

再看看支付成功后的回调接口「没有使用开源的SDK演示」:

public String alipaynotify(Model model, HttpServletRequest request) {

    log.info("支付宝异步回调 ------------beg-----------");    String result = "fail";    //获取支付宝POST过来反馈信息    /* *     * 功能:支付宝服务器异步通知页面     * 说明:     * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。     * 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。     */    Map<String, String> params=this.getAlipayRequest(request);    if(params == null || params.size()==0){        BufferedReader bufferReader = null;        StringBuilder sb = new StringBuilder();        try {            bufferReader = new BufferedReader(request.getReader());

            String line = null;            while ((line = bufferReader.readLine()) != null) {                sb.append(new String(line.getBytes("ISO-8859-1"), "utf-8"));            }        } catch (IOException e) {            e.printStackTrace();        }        String body= null;        try {            body = URLDecoder.decode(sb.toString(),"UTF-8");        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        }        params=UriComponentsBuilder.newInstance().query(body).build().getQueryParams().toSingleValueMap();    }    boolean signVerified =false;    try {        signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type);    } catch (AlipayApiException e1) {        // TODO Auto-generated catch block        log.error("由于"+e1.getErrMsg()+"返回给支付宝系统的结果result:fail");        model.addAttribute("result", "fail");        return result;    } //调用SDK验证签名

    //——请在这里编写您的程序(以下代码仅作参考)——

        /* 实际验证过程建议商户务必添加以下校验:        1、需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,        2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),        3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)        4、验证app_id是否为该商户本身。        */    log.error("支付宝验证签名:---------------------------------"+signVerified);    if(signVerified) {//验证成功        //商户订单号        //交易状态        log.info("支付宝异步回调验签成功!");        String trade_status = params.get("trade_status");

        if("TRADE_FINISHED".equals(trade_status)){            //判断该笔订单是否在商户网站中已经做过处理            //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序            //如果有做过处理,不执行商户的业务程序

            //注意:            //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知            try {                // 在这里处理支付成功后的操作,比如修改订单状态等等                coding...                result = "success";            } catch (Exception e) {                log.error(e.getMessage());                result = "fail";            }        }else if ("TRADE_SUCCESS".equals(trade_status)){            //判断该笔订单是否在商户网站中已经做过处理            //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序            //如果有做过处理,不执行商户的业务程序

            //注意:            //付款完成后,支付宝系统发送该交易状态通知            try {                // 在这里处理支付成功后的操作,比如修改订单状态等等                coding...                result = "success";            } catch (Exception e) {                log.error(e.getMessage());                result = "fail";            }        }else{            result = "fail";        }    }else {//验证失败        result = "fail";        //调试用,写文本函数记录程序运行情况是否正常        //String sWord = AlipaySignature.getSignCheckContentV1(params);        //AlipayConfig.logResult(sWord);        log.debug("支付宝异步回调验签失败");    }    log.debug("异步回调返回给支付宝系统的结果result:"+result);

    model.addAttribute("result", result);    log.info("支付宝异步回调  -------------end ------------");    return result;}

该方法返回给支付宝的 resultsuccessfail 两个结果。

从以上看来,其实不难发现支付宝支付是非常简单的,尽管我上边贴了大量的代码,其实采用开源SDK的话可以更加缩减、美化一些。

ok,这篇文章就到这结束了,上边并没有详细介绍接口调用、参数说明等,详细介绍请查看官方文档:https://docs.open.alipay.com/270/105902/

官方测试Demo下载

上方可运行的官方支付Demo:https://www.lanzous.com/i8qjxij

求关注,求推荐

博客地址:https://www.cnblogs.com/niceyoo

求关注??,求推荐??,如果觉得这篇文章有点东西,不妨左上角关注一下我。

原文地址:https://www.cnblogs.com/niceyoo/p/12207905.html

时间: 2024-11-29 08:17:35

支付宝支付-支付宝PC端扫码支付的相关文章

php微信支付(仅pc端扫码支付模式二)详细步骤.----仅适合第一次做微信开发的程序员

本人最近做了微信支付开发,是第一次接触.其中走了很多弯路,遇到的问题也很多.为了让和我一样的新人不再遇到类似的问题,我把我的开发步骤和问题写出来,以供参考. 开发时间是2016/8/10,所以微信支付的版本也是对应此时的版本. 一.前期准备: 首先你们公司开通微信支付功能后,会收到一份邮件,里面有账户相关信息,一般有:微信支付商户号,商户平台登录帐号,商户平台登录密码,申请对应的公众号,公众号APPID. 1.下载demo:用上面信息登陆“微信商户平台”,>>>(右上角开发文档)>

微信支付教程系列之扫码支付

微信支付教程系列之扫码支付 http://www.cnblogs.com/nangong/p/9fa625bfb92a986125f0ba72704c46ec.html 今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添加好友的时候,可以通过输入对方的微信号,也可以扫一扫对方的二维码.扫码支付,作为,微信支付里面,不可或缺的一个功能,对商品的支付提供了极为方便的体验,用途也非常的多.例如我们在地铁.公交站常见

【原创分享&#183;微信支付】 C# 微信支付教程系列之扫码支付

微信支付教程系列之扫码支付 今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添加好友的时候,可以通过输入对方的微信号,也可以扫一扫对方的二维码.扫码支付,作为,微信支付里面,不可或缺的一个功能,对商品的支付提供了极为方便的体验,用途也非常的多.例如我们在地铁.公交站常见的那些自动售货机(不错,就是那种投硬币,就可以自动出货的那种机器)中都用到.以前,那种机器,只能通过投硬币或者纸币,但是,这里面也有一定的风险

C# 微信扫码支付API (微信扫码支付模式二)

一.SDK下载地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1,下载.NET C#版本: 二.微信相关设置:(微信扫码支付模式二) 1. 公众账号ID,公众账号secert ,地址:https://mp.weixin.qq.com/ 2. 商户号,商户支付密钥KEY,商户平台地址:https://pay.weixin.qq.com/ 5. 部署的服务器终端ip及回调页面 (1)部署的服务器终端ip:即程序部署所在的

2015 ecshop 微信支付插件v3版 含【PC端微信扫码支付+手机端微信支付】

2015ecshop微信支付接口真正的无线支付  ,  ecshop微信接口插件 完美对接微信公众平台 2015最新版本,包可用. 以下是配置截图 手机端配置: PC端配置: 以下是手机购物流程: 1. 2. 3. 4. 5. 6. 8. PC端扫码支付插图 附件下载地址: http://download.csdn.net/detail/joefche/8569353 联络QQ: 75189343

支付宝支付之扫码支付(电脑网站支付)、H5支付(手机网站支付)相关业务流程分析总结

前言 在上一篇文章<微信支付之扫码支付.公众号支付.H5支付.小程序支付相关业务流程分析总结>中,分析和总结了微信支付相关支付类型的业务流程,这里作为与微信支付平起平坐不相伯仲的支付宝支付,当然也是每个公司少不了的第三方支付接入选择. 因此,本篇文章主要分析和总结支付宝支付中的扫码支付.H5支付相关业务流程. 概述 1. 电脑网站支付 电脑网站支付,也称扫码支付,是专门针对电脑而开发的一种支付方式,既在网页展示一个动态生成的支付二维码,用户通过手机支付宝扫码以后可实现支付功能的一种支付方式.

微信:微信扫码支付、调用统一下单接口、网站支付 + springmvc

一.场景:公司需要在网站上进行微信支付. 二.API:使用微信开放平台的接入微信支付 -扫码支付.微信支付开发者平台链接 三.分析: 接入扫码支付(包含PC网站支付)包含三个阶段,问这里只讲使用,也就是第2阶段的<启动设计和开发>. 点击查看开发者文档(扫码支付)后,这里感觉微信的文档没有支付宝好理解(稍微吐槽下~~~),不过我们忽略一切,直接进入模式二:模式二最简单直接,不需要在商户后台进行配置,推荐大家使用,微信也说流程更为简单,我这里也讲的是模式二,模式一大家有兴趣可以自行研究下. 如上

8. PHP接入微信的三种支付:APP支付、公众号支付、扫码支付

微信的支付逻辑与支付宝的支付有一些差别.为了让客户端忽略这些差别,统一调用.本sdk做了对应处理. # SDK调用 微信支付不同接口需要的参数会有差别.请大家在使用接口时,仔细查看文档. use Payment\ChargeContext; use Payment\Config; use Payment\Common\PayException; // 微信支付,必须设置时区,否则发生错误 date_default_timezone_set('Asia/Shanghai'); // 生成订单号 便

JAVA微信扫码支付模式二功能实现以及回调

一.准备工作 首先吐槽一下微信关于支付这块,本身支持的支付模式就好几种,但是官方文档特别零散,连像样的JAVA相关的demo也没几个.本人之前没有搞过微信支付,一开始真是被它搞晕,折腾两天终于调通了,特此写下来,以享后人吧! 关于准备工作,就"微信扫码支付模式二"官方文档地址在这 https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1 可以先看看,实际上需要准备的东西有以下几个: 其中APP_ID和APP_SECRET