支付宝支付_支付宝支付怎么查看异步回调 - CSDN
  • 支付宝支付开发流程

    2018-02-22 12:07:24
    支付宝开发流程1、首先我们先谈谈第三方支付所谓第三方支付就是和一些各大银行签约,并具备一定实力和信誉保障的第三方独立机构提供的交易平台目前市面上常见的有支付宝,财付通,网银,易宝支付等,网站需要实现第...
    支付宝开发流程

    1、首先我们先谈谈第三方支付
    所谓第三方支付就是和一些各大银行签约,并具备一定实力和信誉保障的第三方独立机构提供的交易平台
    目前市面上常见的有支付宝,财付通,网银,易宝支付等,网站需要实现第三方支付首先应向第三方申请一个账号并签署协议,协议生效后第三方支付平台为其开通在线支付功能。
    2、第三方支付的原理

    2.1用户向商城网站发起确认订单的请求

      2.2商城网站接收到请求保存订单数据到数据库或其他存储介质

      2.3返回订单确认页面,页面上应该显示订单金额等信息

      2.4用户确认支付,发起支付请求。注:支付请求是发送到支付网关(比如支付宝、网银在线)而不是发送到商城网站。

      2.5显示支付页面

      2.6用户填写认证信息(账号密码等)提交

      2.7这里有两个步骤一个是扣款成功后页面跳转到支付结果页面(展示给用户),另一个是支付通知,这两步没有先后顺序可能同时执行,商城网站接收到支付通知后根据验证规则验证信息的有效性,并作出相应的更改操作(例:有效则更改订单为已付款状态,无效则记录非法请求信息)。

      以支付宝为例:如果实现在网站中集成支付宝接口,首先要有一个支付宝账号,接下来向支付宝申请在线支付业务,签署协议。协议生效后有支付宝一方会给网站方一个合作伙伴ID,和安全校验码,有了这两样东西就可以按照支付宝接口文档开发支付宝接口了,在上图的几个步骤中只有4和7两个步骤在商城与支付网关之间有信息交互。在步骤4中指将数据发送到支付网关(支付宝),在步骤7中是的通知验证部分,验证网关请求网站某地址,网站按验证规则对信息进行验证记录并作出响应,我们几乎在开发任何支付接口时,重点是这两部分的开发,明白支付接口原理,开发支付接口就不难了。

    其实看图来说,我们所做的很有限,基本在1~3之间,生成订单数据,然后会通过支付宝内部进行认证(当然其中省略了一些购物车、订单的步骤),基本一个流程结束。
    3、支付宝接口开发
    3.1接口简介与测试
    就目前来讲,支付宝提供了担保交易,标准即时到账,双功能等几种接口,只是在功能上有些差异,集成方式都是一样,以标准及时到账接口为例,在与支付宝签署协议后,还需要几个步骤才能完成集成。

    选择“我要自助集成”接下来会看到的链接,点击下载技术文档。

      在下载后的文件中有标准支付宝交易服务接口、商家工具、接口集成指南等接文档,另外还有几种语言写的demo.我们可以根据接口文档按规则全新开发,也可以再demo基础上修改集成到网站,需要注意的是开发支付接口需要在公网(服务器必须可以通过外网访问)才可以完成整个调试过程,如果服务器在外网访问不到,则无法接收到支付通知。


    demo中每个文件的作用


    create_direct_pay_by_user-php-UTF-8
      │
      ├lib┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈类文件夹
      │  │
      │  ├alipay_core.function.php ┈┈┈┈┈┈支付宝接口公用函数文件
      │  │
      │  ├alipay_notify.class.php┈┈┈┈┈┈┈支付宝通知处理类文件
      │  │
      │  ├alipay_submit.class.php┈┈┈┈┈┈┈支付宝各接口请求提交类文件
      │  │
      │  └alipay_md5.function.php┈┈┈┈┈┈┈支付宝接口MD5函数文件
      │
      ├log.txt┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈日志文件
      │
      ├alipay.config.php┈┈┈┈┈┈┈┈┈┈┈┈基础配置类文件
      │
      ├alipayapi.php┈┈┈┈┈┈┈┈┈┈┈┈┈┈支付宝接口入口文件
      │
      ├notify_url.php ┈┈┈┈┈┈┈┈┈┈┈┈┈服务器异步通知页面文件
      │
      ├return_url.php ┈┈┈┈┈┈┈┈┈┈┈┈┈页面跳转同步通知文件
      │
      ├cacert.pem ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈用于CURL中校验SSL的CA证书文件
      │
      └readme.txt ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈使用说明文本

    这里已经下载好了(见资源目录pay文件夹),为了便于调试增加修改了若干文件,并增加了一张数据表保存订单信息,我们修改一下配置文件完成一个测试过程。

      alipay_config.php是基础信息配置文件,我们需要将在支付宝后台获取的PID与Key写入到配置文件中。


      配置项:


     其中方框内的数据是我们需要重点修改的。支付通知地址与返回地址的区别,前面已经提到,在步骤7中有两项:支付结果页面与支付通知信息,支付结果页面是用户支付完成后会自动跳转到这个地址这里是返回地址($return_url)。



     $host = $_SERVER['HTTP_HOST'];
    //↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    //合作身份者ID,签约账号,以2088开头由16位纯数字组成的字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
    $alipay_config['partner'] = '****************';


    //收款支付宝账号,以2088开头由16位纯数字组成的字符串,一般情况下收款账号就是签约账号
    $alipay_config['seller_id'] = $alipay_config['partner'];


    // MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
    $alipay_config['key'] = '****************************';


    // 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    $alipay_config['notify_url'] = "http://".$host."/paycallback/notify";


    // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    $alipay_config['return_url'] = "http://".$host."/paycallback/return";

    // 客户端的IP地址 非局域网的外网IP地址,如:221.0.0.1
    $alipay_config['exter_invoke_ip'] = "182.92.27.46";



     支付通知地址同样是用户支付完成后,支付宝会请求该地址($notify_url),但是支付通知是支付宝服务器直接请求,不会被用户看到。这两个地址必须是以http开头的完整路径格式为了完成测试过程,这里已经将/pay/alipay/notify_url.php改写,将$notify_url设置为可访问到此文件的URL即可。这几项配置好后再根据数据库脚本(pay/orders.sql)创建一张数据表。并根据数据库的配置信息修改mysql_config.php.通过对支付宝提供的demo做简单修改就可以完成创建支付请求(步骤4)了,这里更改了支付首页等页面(见源码包pay目录)。我们先测试一下:




     数据库中增加了一条“订单信息”.

      如果点击“确认支付”按钮或者确认支付 链接将会跳转到支付宝页面,点击按钮时通过表单POST方式将信息提交到支付网关,由于支付请求数据无需让用户看到,这里都写在隐藏域中了。确认支付 链接是通过URL传参,因为支付宝接口允许以POST或者GET方式提交,所以两种方式都可以。把参数提交给支付网关后,页面跳转到到支付页面。我们看到如下图所示:



     我们看到支付宝为我们提供了两种支付方式,一种是通过支付宝账户支付,另一种是通过银行卡支付。例如选择使用银行卡支付,填写邮箱或手机号跳转到如下页面:



     我们开单支付宝几乎支持所有的银行卡支付,同时有信用卡和网点方式付款,选择对应的银行下一步按提示付款即可。付款完成后页面会返回到我们在配置文件中配置的$return_url地址,同时“订单状态”也会发生改变。



    注:测试时如果没有在外网测试(即支付通知地址无法在外网访问)则支付通知无法被请求到,无法自动完成订单状态的修改。

      3.2支付宝接口规范与代码分析

      支付宝接口规范可参考/pay/doc/标准支付宝交易服务接口(专用于防钓鱼网站)。Pdf,里面已经有了比较详细的说明。

      3.2.1如何创建支付请求

      在前面的测试中我们点击了“确认支付”将信息将信息提交到了支付宝的支付网关,我们可以思考一下应该发送哪些参数给支付网关。关于请求参数列表可以参考标准支付宝交易服务接口(专用于防钓鱼网站)。Pdf中的3.2.2.需要注意的是并不是我们把这些参数原封不动的提交到支付宝就可以了,为了保证数据安全支付宝目前使用的是MD5签名防止数据篡改机制。

      在提交数据前需要将需要提交的数据以一定规则(见接口文档)组装成字符串,加上安全校验码(Key)组成一个新字符串,通过MD5生成一个32字节的签名,我们提交支付请求时还需要把这个签名也提交过去。看一下表单源码


     支付宝接收到参数后会进行验证请求参数的合法性,验证无误后将显示支付页面,否则提示错误。

      3.2.2 如何验证支付通知

      在用户支付完成后,支付宝会请求网站支付通知地址(这个地址应在创建支付请求时作为参数传递过去)。返回参数列表参见标准支付宝交易服务接口(专用于防钓鱼网站)。Pdf3.3.1.支付宝的返回数据中同样有一个签名串(采取和支付请求同样的签名方式),在支付通知文件中首先要对数据进行签名验证。除了验证签名,还需要将参数中的notify_id提交到支付宝的验证网关支付宝系统这个通知的真实性,通知验证。支付宝系统判断通知是否是自己发送,如果是以字符串格式返回 true,否则返回false,我们通过验证服务器返回的数据验证请求的真实性,如果都验证通过则可以进行更改订单数据、给用户发送邮件通知等操作。关于验证签名可以看一下通知文件中的源码。带demo中将参数中的notify_id提交到支付宝是通过POST方式提交并取得返回数据,代码片段:



    重点就是fsockopen函数,在发送电子邮件时我们已经接触过,通过此函数打开套接字连接,类似于以前学过的fopen函数返回的是一个文件句柄,之后可以使用文件函数( fgets()、fgetss()、fputs()、fclose() feof()等)对其进行操作,代码中使用了fputs()(同fwrite())函数,写入数据来模拟表单以POST方式提交数据,最后通过fgets()函数获取返回的数据保存到数组中,最后进行验证,具体参照源码。




    转载自 http://blog.csdn.net/chajinglong/article/details/55209802

    可参考 http://blog.csdn.net/xxssyyyyssxx/article/details/52822267

    展开全文
  • 支付宝的web支付,是学员在制作web网站商城知识之一,支付宝支付和微信支付是web网站支付的知识,学员在学会扫码支付的同时学会看开发API文档。增加学员的实战能力
  • 对接支付宝支付接口,官方文档已经写的很清楚了,但是也有很多像我一样的小白,第一次对接支付宝支付接口,会有些迷茫,所以我在此写下这篇文章,给我和我一样的同学,一点思路吧。 第一步:(先要在支付宝进行操做...

    对接支付宝支付接口,官方文档已经写的很清楚了,但是也有很多像我一样的小白,第一次对接支付宝支付接口,会有些迷茫,所以我在此写下这篇文章,给我和我一样的同学,一点思路吧。

    第一步:(先要在支付宝进行操做,拿到我们需要开发的信息后在动代码)

    进入蚂蚁金服,我们先要创建应用 看到图下的应用按钮了吗?

    点击应用(如下图)

    创建应用(创建应用需要审核)提供资料审核吧,这个时候我们就不用管他了。审核通过就可以用了。

    但是他审核我们也不能闲着着 ,我们先弄个测试把代码写出来,等审核沟通过后我们这边在替换审核后的信息即可。

    第二步(使用沙箱环境进行开发)

    看到APPID了吗这个很重要,我们支付的时候需要用到它,当前审核的后的信息里也会有,这个沙箱就是给我们测试用的,和正式几乎是一致的,只是切换不同的APPID和支付宝网关。(这里我要吐槽一下微信支付,微信支付说真的文档太烂,坑太多,后续我也会把微信支付对接弄上来。)支付宝还有一个好的地方就是旁边的机器人了,这个很到位,有不会的呼叫一下即可(小技巧:使用机器人,问题多打几次,人工就出来了,要不人工出不来呢。)

    在这个界面需要设定应用公钥

    点击打开设置应用公钥(其他不用设定)点击设置应用公钥

    ok ,这里是输入公钥的地方,如何生成钥匙,请点击查看生成秘钥方法(下图,下载钥匙生成工具)

    下载后按照说明打开(切记安照说明进行打开

    点击生成秘钥(这里注意:不要去验签你生成的秘钥,因为你验签会失败)我们直接拷贝生成的公钥放入即可。

     

    这里也不需要验证公钥的准确性 直接点击保存即可。

    第三步:导入alipay的jar包(jar包在)

    https://docs.open.alipay.com/54/104506/ 这个是支付demo 里面有jar 包,导入即可。

     

    第四步:编写代码

    创建一个AppPayConfig 类如下图放入对应的值即可

    编写action 类

    ok 到此支付宝就对接完毕了,当然上面有个异步回调地址,这个接口也是需要些的,我这了就不贴出来了。不知道大家能不能看明白,如果还有模糊,可以呼叫我吧。谢谢大家的阅读。

     

    展开全文
  • 让开发者快速学习支付宝支付功能,本课程基于Java语言开发,通过搭建官方提供的DEMO实现支付适用人群在互联网开发中,需要使用支付环节的技术 课程简介 从零讲起支付宝支付,基于官方提供的Java DEMO实现网页...
  • Java支付宝支付

    2019-07-04 14:37:12
    Java支付宝支付 一:支付宝支付接入准备工作: 首先,支付宝支付和微信支付意愿,都是只支持企业用户,个人用户是不能接入支付宝支付的,所以要想接入支付宝支付,首先需要有支付宝的企业账号,有了企业账号才能拿...

    Java支付宝支付

    一:支付宝支付接入准备工作:

    首先,支付宝支付和微信支付意愿,都是只支持企业用户,个人用户是不能接入支付宝支付的,所以要想接入支付宝支付,首先需要有支付宝的企业账号,有了企业账号才能拿到支付宝支付的所需参数,这些工作都是需要公司层面的人操作的,作为码农,只管拿到这些需要的参数就可以进行看文档,对接支付支付接口了。那支付宝支付都需要哪些参数呢,请看下面:

    	// 支付宝支付参数配置 //
        @Value("${ALIPAY.APPID}")
        protected String app_id;//应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
        @Value("${ALIPAY.PRIVATEKEY}")
        protected String merchant_private_key;//商户私钥,您的PKCS8格式RSA2私钥
        @Value("${ALIPAY.PUBLICKEY}")
        protected String alipay_public_key;//支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
        @Value("${ALIPAY.NOTIFY_URL}")
        protected String notify_url;//服务器异步通知页面路径
        @Value("${ALIPAY.RETURNA_URL}")
        protected String return_url;//页面跳转同步通知页面路径
        @Value("${ALIPAY.SIGN}")
        protected String sign_type = "RSA2";//签名方式
        protected String charset = "utf-8";//字符编码格式
        @Value("${ALIPAY.GATEWAY_URL}")
        protected String gateway_url;//支付宝网关
    
    

    上面就是支付宝支付需要的各类参数,在开始写代码之前,需要先把这些参数配置好才能进行下面的工作。
    二:支付宝(电脑网站支付)接口说明:
    首页访问支付宝的开放平台:https://docs.open.alipay.com/270 ,然后查看快速接入文档,首先是创建应用,然后是配置密钥,最好是搭建和配置开放环境。配置好上面的各项工作,下面来看下支付宝支付的接口说明:
    alipay.trade.page.pay(PC场景下单并支付)
    支付流程
    在这里插入图片描述
    公共参数
    请求地址:

    环境 HTTPS请求地址
    正式环境 https://openapi.alipay.com/gateway.do

    公共请求参数:
    在这里插入图片描述
    请求参数
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    三:下载支付宝的SDK

    下载地址:https://docs.open.alipay.com/270/106291/, 下载后可以导入本地,然后修改对应的配置,就可以测试支付接口了

    四:安装支付宝的SDKmaven依赖

    由于我们准备使用支付宝提供的SDK实现支付接口的对接,所以需要把支付宝的SDK安装到我们的本地maven仓库,安装命令如下:

    mvn install:install-file -DgroupId=com.alipay.api -DartifactId=alipay-sdk-java20170324180803 -Dversion=1.0.0 -Dpackaging=jar -Dfile=D://alipay-sdk-java20170324180803.jar
    

    安装好支付宝的SDK后,就可以在maven项目里面引用该依赖了,如下:

    !--支付宝SDK-->
            <dependency>
                <groupId>com.alipay.api</groupId>
                <artifactId>alipay-sdk-java20170324180803</artifactId>
                <version>1.0.0</version>
            </dependency>
    

    五:支付宝支付的核心代码

    AlipayVo.java

    package com.micai.springboot.vo.pay;
     
    import java.io.Serializable;
     
    /**
     * @Auther: Mike
     * @Date: 2018/8/30 15:14
     * @Description: 支付请求参数
     */
    public class AlipayVo implements Serializable {
     
        private static final long serialVersionUID = 1L;
        /**
         * 订单名称
         */
        private String subject;
        /**
         * 商户网站唯一订单号
         */
        private String out_trade_no;
        /**
         * 该笔订单允许的最晚付款时间
         */
        private String timeout_express;
        /**
         * 付款金额
         */
        private String total_amount;
        /**
         * 销售产品码,与支付宝签约的产品码名称
         */
        private String product_code;
     
        public String getSubject() {
            return subject;
        }
     
        public void setSubject(String subject) {
            this.subject = subject;
        }
     
        public String getOut_trade_no() {
            return out_trade_no;
        }
     
        public void setOut_trade_no(String out_trade_no) {
            this.out_trade_no = out_trade_no;
        }
     
        public String getTimeout_express() {
            return timeout_express;
        }
     
        public void setTimeout_express(String timeout_express) {
            this.timeout_express = timeout_express;
        }
     
        public String getTotal_amount() {
            return total_amount;
        }
     
        public void setTotal_amount(String total_amount) {
            this.total_amount = total_amount;
        }
     
        public String getProduct_code() {
            return product_code;
        }
     
        public void setProduct_code(String product_code) {
            this.product_code = product_code;
        }
    }
    

    PayBaseController.java

    package com.micai.springboot.controller.pay;
     
    import com.micai.springboot.base.BaseController;
    import org.springframework.beans.factory.annotation.Value;
     
    /**
     * @Auther: Mike
     * @Date: 2018/8/31 13:40
     * @Description:
     */
    public abstract class PayBaseController extends BaseController {
     
        // 支付宝支付参数配置 //
        @Value("${ALIPAY.APPID}")
        protected String app_id;//应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
        @Value("${ALIPAY.PRIVATEKEY}")
        protected String merchant_private_key;//商户私钥,您的PKCS8格式RSA2私钥
        @Value("${ALIPAY.PUBLICKEY}")
        protected String alipay_public_key;//支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
        @Value("${ALIPAY.NOTIFY_URL}")
        protected String notify_url;//服务器异步通知页面路径
        @Value("${ALIPAY.RETURNA_URL}")
        protected String return_url;//页面跳转同步通知页面路径
        @Value("${ALIPAY.SIGN}")
        protected String sign_type = "RSA2";//签名方式
        protected String charset = "utf-8";//字符编码格式
        @Value("${ALIPAY.GATEWAY_URL}")
        protected String gateway_url;//支付宝网关
     
        // 微信支付参数配置 //
        @Value("${WXPAY.APPID}")
        protected String APPID;//公众账号ID
        @Value("${WXPAY.MCHID}")
        protected String MCHID;//微信支付商户号
        @Value("${WXPAY.KEY}")
        protected String KEY;//API密钥
        @Value("${WXPAY.APPSECRET}")
        protected String APPSECRET;//AppSecret是APPID对应的接口密码
        @Value("${WXPAY.NOTIFY_URL}")
        protected String NOTIFY_URL;//回调地址。测试回调必须保证外网能访问到此地址
        @Value("${WXPAY.CREATE_IP}")
        protected String CREATE_IP;//发起请求的电脑IP
     
    }
    

    AlipayController.java

    package com.micai.springboot.controller.pay;
     
    import com.alibaba.fastjson.JSONObject;
    import com.alipay.api.AlipayApiException;
    import com.alipay.api.AlipayClient;
    import com.alipay.api.DefaultAlipayClient;
    import com.alipay.api.internal.util.AlipaySignature;
    import com.alipay.api.request.AlipayTradePagePayRequest;
    import com.google.gson.Gson;
    import com.micai.springboot.vo.pay.AlipayVo;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
     
    import javax.servlet.http.HttpServletRequest;
    import java.io.UnsupportedEncodingException;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.UUID;
     
    /**
     * @Auther: Mike
     * @Date: 2018/8/30 15:11
     * @Description: 支付宝后台接口
     */
    @RestController
    @RequestMapping(value = "/alipay")
    public class AlipayController extends PayBaseController {
     
        /**
         * 支付网站扫码支付接口-统一下单支付接口
         * @return
         * @throws AlipayApiException
         */
        @GetMapping("/pay")
        private String alipayPay() throws AlipayApiException {
            //这个应该是从前端端传过来的,这里为了测试就从后台写死了
            AlipayVo vo = new AlipayVo();
            vo.setOut_trade_no(UUID.randomUUID().toString().replace("-", ""));
            vo.setTotal_amount("0.01");
            vo.setSubject("nelson-test-title");
            vo.setProduct_code("FAST_INSTANT_TRADE_PAY"); //这个是固定的
            String json = new Gson().toJson(vo);
            logger.info("json: {}", json);
     
            AlipayClient alipayClient = new DefaultAlipayClient(gateway_url, app_id, merchant_private_key, "json",charset,alipay_public_key,sign_type);
            // 设置请求参数
            AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
            alipayRequest.setReturnUrl(return_url);
            alipayRequest.setNotifyUrl(notify_url);
            alipayRequest.setBizContent(json);
            String result = alipayClient.pageExecute(alipayRequest).getBody();
            logger.info("result: {}", result);
            return result; //这里生成一个表单,会自动提交
        }
     
        /**
         * 支付宝服务器异步通知页面
         * @param request
         * @param out_trade_no 商户订单号
         * @param trade_no 支付宝交易凭证号
         * @param trade_status 交易状态
         * @return
         * @throws AlipayApiException
         */
        @PostMapping("/notify")
        public String alipayNotify(HttpServletRequest request, String out_trade_no, String trade_no, String trade_status) throws AlipayApiException {
            Map<String, String> params = getParamsMap(request);
            logger.info("notify params: {}", JSONObject.toJSON(params));
            // 验证签名
            boolean signVerified = AlipaySignature.rsaCheckV1(params, alipay_public_key, charset, sign_type);
            logger.info("notify signVerified: {}", signVerified);
            if (signVerified) {
                //处理你的业务逻辑,更细订单状态等
                return ("success");
            } else {
                logger.info("验证失败,不去更新状态");
                return ("fail");
            }
        }
     
        /**
         * 支付宝服务器同步通知页面
         * @param request
         * @param out_trade_no 商户订单号
         * @param trade_no 支付宝交易凭证号
         * @param total_amount 交易状态
         * @return
         * @throws AlipayApiException
         */
        @GetMapping("/return")
        public String alipayReturn(HttpServletRequest request, String out_trade_no,String trade_no,String total_amount) throws AlipayApiException {
            Map<String, String> params = getParamsMap(request);
            logger.info("return params: {}", JSONObject.toJSON(params));
     
            // 验证签名
            boolean signVerified = AlipaySignature.rsaCheckV1(params, alipay_public_key, charset, sign_type);
            logger.info("return signVerified: {}", signVerified);
     
            if (signVerified) {
                return ("success");
            } else {
                logger.info("验证失败,不去更新状态");
                return ("fail");
            }
        }
     
        private Map<String, String> getParamsMap(HttpServletRequest request) {
            Map<String,String> params = new HashMap<>();
            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] + ",";
                }
                //乱码解决,这段代码在出现乱码时使用
                try {
                    valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
                    params.put(name, valueStr);
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }
            return params;
        }
     
    }
    
    

    六:运行支付宝支付URL:http://dvnq2b.natappfree.cc/alipay/pay, 返回如下支付二维码页面:

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    支付宝回调日志如下,其中包括了同步回调和异步回调:

    在这里插入图片描述

    七:总结:

    经过上面的所以流程,相信大家都明白了支付宝支付的流程,这里我们对上面的流程做个总结,要想接入支付宝支付,必须是企业用户才行,个人用户不支持,所以在开始写代码之前,要和公司的相关负责人申请好支付宝支付的相关配置参数,有了这些才能进行下面的工作,这里最重要的一点就是支付宝支付的回调了,回调,在生产环境必须配置可以外网访问的URL,同时域名必须是备案过的,二级域名也可以,这里我们为了方便测试,所以就使用了内网穿透工具natapp,该工具既有免费通道也有收费通道,收费通道也很便宜,如果只是测试,免费通道就够用了,另外还有一点要注意,就是支付宝支付的回调,默认支付宝是回调多次的,所以会有重复回调的问题,这里留给大家一个思考,怎么防止支付宝的多次回调,以免影响业务,希望有兴趣的小伙伴可以留言交流。以上就是支付宝支付(电脑网站支付)的全部内容了

    展开全文
  • 应公司业务要求,需要调用支付宝支付接口进行支付的操作,于是将整个调用过程用博客形式记录下来,以供以后使用。 本次调用支付宝采用的是电脑支付,官方文档页面如下: 电脑端调用支付宝,流程很简单,在页面...

    应公司业务要求,需要调用支付宝的支付接口进行支付的操作,于是将整个调用过程用博客形式记录下来,以供以后使用。

    本次调用支付宝采用的是电脑支付,官方文档页面如下:

    这里写图片描述

    电脑端调用支付宝,流程很简单,在页面有一个立即支付的按钮,点击进入商户的后台,商户的后台将支付所需的参数传给支付宝,支付宝返回给商户一个字符串形式的form表单,商户将这个form表单传给前台,前台对表单进行提交即可跳转到支付包页面,用户在支付宝页面支付完成后,支付宝会先调取我们的通知接口进行支付结果通知。然后跳转到我们传给支付包的回调页面。这就是电脑端调用支付宝的整个流程。

    要调用支付宝的接口,首先需要下载支付宝的sdk。这里给出官方的下载地址:
    支付宝sdk下载地址。下载下来的是一个zip包,里面文件如下:

    这里写图片描述

    这四个jar包文件如下:
    alipay-sdk-java-3.0.0.jar┈┈┈┈┈┈┈支付宝SDK编译文件jar
    alipay-sdk-java-3.0.0-source.jar┈┈┈ 支付宝SDK源码文件jar
    commons-logging-1.1.1.jar┈┈┈┈┈┈SDK依赖的日志jar
    commons-logging-1.1.1-sources.jar┈┈SDK依赖的日志源码jar
    项目中需要引入的是alipay-sdk-java-3.0.0.jar和commons-logging-1.1.1.jar。对于commons-logging-1.1.1.jar,可以直接在pom文件中添加依赖:

    <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.1.1</version>
    </dependency>
    

    对于alipay-sdk-java-3.0.0.jar,目前maven仓库没有该依赖,只能手动添加。首先将alipay-sdk-java-3.0.0.jar放入D盘的根目录下,然后运行mvn命令:

     mvn install:install-file -DgroupId=com.alipay -DartifactId=sdk-java -Dversion=3.0.0 -Dpackaging=jar -Dfile=alipay-sdk-java-3.0.0.jar

    此命令会把支付宝的jar包打包到maven本地仓库下,然后在pom文件中引用:

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

    即可完成支付宝jar包的导入。

    前面准备工作已经做好,现在来看看代码,我把对支付宝的调用都封装到了一个工具类中:

    package com.avie.ltd.utils;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    
    import com.alipay.api.AlipayApiException;
    import com.alipay.api.AlipayClient;
    import com.alipay.api.DefaultAlipayClient;
    import com.alipay.api.internal.util.AlipaySignature;
    import com.alipay.api.request.AlipayTradePagePayRequest;
    import com.alipay.api.request.AlipayTradeRefundRequest;
    import com.avie.ltd.config.AlipayConfig;
    
    public class PayUtil {
    
    
        /**
         * 
         * @param outTradeNo  商户订单号,商户网站订单系统中唯一订单号,必填   对应缴费记录的orderNo
         * @param totalAmount  付款金额,必填
         * @param subject 主题
         * @param body 商品描述,可空
         * @return
         */
        public static String alipay(String outTradeNo,String totalAmount,String subject,String body) {
            //获得初始化的AlipayClient
                    AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
    
                    //设置请求参数
                    AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
                    alipayRequest.setReturnUrl(AlipayConfig.return_url);
                    alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
                    try {               
                    alipayRequest.setBizContent("{\"out_trade_no\":\""+ outTradeNo +"\"," 
                            + "\"total_amount\":\""+ totalAmount +"\"," 
                            + "\"subject\":\""+ subject +"\"," 
                            + "\"timeout_express\":\""+ Constants.TIMEOUT_EXPRESS +"\"," 
                            + "\"body\":\""+ body +"\"," 
                            + "\"qr_pay_mode\":\""+ Constants.QR_PAY_MODE +"\"," 
                            + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");                                                                                                                                                               
    
                    //请求
                    String result;
    
                    result = alipayClient.pageExecute(alipayRequest).getBody();
                    System.out.println("*********************\n返回结果为:"+result);
                    return result;
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        return null;
                    }
        }
    
        /**
         * 支付宝退款接口
         * @param outTradeNo
         * @param tradeNo
         * @param refundAmount
         * @param refundReason
         * @param out_request_no  标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传
         * @return
         */
        public static String aliRefund(String outTradeNo,String tradeNo,String refundAmount,String refundReason,String out_request_no) {
            //获得初始化的AlipayClient
                    AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
    
                    //设置请求参数
                    AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();
                    alipayRequest.setReturnUrl(AlipayConfig.return_url);
                    alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
                    try {               
                        alipayRequest.setBizContent("{\"out_trade_no\":\""+ outTradeNo +"\"," 
                                + "\"trade_no\":\""+ tradeNo +"\"," 
                                + "\"refund_amount\":\""+ refundAmount +"\"," 
                                + "\"refund_reason\":\""+ refundReason +"\"," 
                                + "\"out_request_no\":\""+ out_request_no +"\"}");                                                                                                                                                               
    
                    //请求
                    String result;
    
                    //请求
                    result = alipayClient.execute(alipayRequest).getBody();
                    System.out.println("*********************\n返回结果为:"+result);
                    return result;
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        return null;
                    }
        }
    
        /**
         * 支付宝的验签方法
         * @param req
         * @return
         */
        public static boolean checkSign(HttpServletRequest req) {
            Map<String, String[]> requestMap = req.getParameterMap();
            Map<String, String> paramsMap = new HashMap<>();
            requestMap.forEach((key, values) -> {
                  String strs = "";
                  for(String value : values) {
                  strs = strs + value;
                  }
                  System.out.println(("key值为"+key+"value为:"+strs));
                  paramsMap.put(key, strs);
                });
    
            //调用SDK验证签名
            try {
                return  AlipaySignature.rsaCheckV1(paramsMap, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type);
            } catch (AlipayApiException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                System.out.println("*********************验签失败********************");
                return false;
            }
        }
    }

    这个工具类一共有三个静态方法。
    alipay:支付宝的下单接口
    aliRefund:支付宝的退款方法
    checkSign:支付宝的验签方法

    先来讲alipay这个方法,当我们需要下单的时候,需要在业务逻辑代码中调用该工具类的该方法。该方法需要传入的参数如下:

    outTradeNo: 商户订单号,商户网站订单系统中唯一订单号,必填 。需要保证商户端唯一。
    totalAmount :付款金额,必填
    subject:主题
    body:商品描述,可空

    都是一些商品属性的基本参数,一般都是根据我们具体的业务逻辑去设置。进入方法,第一句话:

    AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);

    这句话主要是初始化一个DefaultAlipayClient,这个类的初始化构造器需要传很多参数,从左往右依次为:支付宝的网关,商户的appid,商户的私钥,传参的格式,传参的字符集,商户的公钥,商户的签名类型。这里都把这些参数封装进了AlipayConfig这个类里面,来看看AlipayConfig这个类:

    package com.avie.ltd.config;
    
    import java.io.FileWriter;
    import java.io.IOException;
    
    /* *
     *类名:AlipayConfig
     *功能:基础配置类
     *详细:设置帐户有关信息及返回路径
     *修改日期:2017-04-05
     *说明:
     *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
     *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
     */
    
    public class AlipayConfig {
    
    //↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    
        // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
        public static String app_id = "你的APPID";
    
        // 商户私钥,您的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://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
        public static String return_url = "你的回调页面";
    
        // 签名方式
        public static String sign_type = "RSA2";
    
        // 字符编码格式
        public static String charset = "utf-8";
    
        // 支付宝网关
        public static String gatewayUrl = "https://openapi.alipay.com/gateway.do";
    
        // 支付宝网关
        public static String log_path = "C:\\";
    
    
    //↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
    
        /** 
         * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
         * @param sWord 要写入日志里的文本内容
         */
        public static void logResult(String sWord) {
            FileWriter writer = null;
            try {
                writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis()+".txt");
                writer.write(sWord);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (writer != null) {
                    try {
                        writer.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    这个类其实很简单,就是存储了一些支付所需的公钥啊,私钥啊等参数,方便同意管理和使用。代码往下走AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();就是初始化一个阿里封装的request,后面几句就是设置这个request要传入的参数,把回调函数地址,外部订单好,金额都设置到request里面。然后执行alipayClient.pageExecute(alipayRequest).getBody();这个方法,即可向支付宝发起一个下单请求,支付宝返回给我们的是一个字符串,这个字符串实际上是一个form表单。现在,我们写个简单的方法来测试以下,代码如下:

    package com.avie.itd;
    
    import com.avie.ltd.utils.PayUtil;
    
    public class Test {
    
        public static void main(String[] args) {
    
            String str = PayUtil.alipay("2313131", "0.01", "hehe", "haha");
            System.out.println(str);
        }
    
    }

    测试方式非常简单,不需要弄什么运行环境或者一大堆依赖,就写个main方法,调用我的PayUtil的alipay方法,传入自己随便编的参数,右键运行即可。如果基本的参数配置都没有错,那么你的控制台会打印出如下结果:

    这里写图片描述

    看到了吗,返回的结果实际上是一个表单加上一个javascript脚本,脚本的目的在于提交表单。所以在实际开发中,你只需要拿到这个返回结果,把结果传给前端,前端把用jquery把这段代码放入一个div即可。表单自动提交,然后你就会跳转到支付宝的支付页面了。

    那么到这里就完了吗?肯定还没有,支付完成后,支付宝会将支付结果推送到我们自己的业务系统中,因此我们需要为支付宝写个异步通知的接口。先来看代码:

    package com.avie.ltd.controller;
    
    import java.io.IOException;
    import java.util.SortedMap;
    import java.util.TreeMap;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.util.StringUtils;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    import com.avie.ltd.entity.AliReturnPayBean;
    import com.avie.ltd.service.TbPaymentRecordsService;
    import com.avie.ltd.utils.JaxbUtil;
    import com.avie.ltd.utils.PayUtil;
    import com.avie.ltd.utils.wxUtil.UnifiedOrderRespose;
    import com.thoughtworks.xstream.XStream;
    
    import net.sf.json.JSONObject;
    
    @Controller
    @RequestMapping(value = "/returnPay")
    public class ReturnController {
    
        private static Logger logger = LoggerFactory.getLogger(ReturnController.class);
        @Autowired
        private TbPaymentRecordsService tbPaymentRecordsService;
    
        /**
         * 支付宝回调的接口
         * 
         * @param uuid
         * @return
         * @throws IOException
         */
        @RequestMapping(value = "/aliReturnPay", method = RequestMethod.POST)
        public void returnPay(HttpServletResponse response, AliReturnPayBean returnPay, HttpServletRequest req)
                throws IOException {
            response.setContentType("type=text/html;charset=UTF-8");
            logger.info("****************************************支付宝的的回调函数被调用******************************");
            if (!PayUtil.checkSign(req)) {
                logger.info("****************************************验签失败*******************************************");
                response.getWriter().write("failture");
                return;
            }
            if (returnPay == null) {
                logger.info("支付宝的returnPay返回为空");
                response.getWriter().write("success");
                return;
            }
            logger.info("支付宝的returnPay" + returnPay.toString());
            if (returnPay.getTrade_status().equals("TRADE_SUCCESS")) {
                logger.info("支付宝的支付状态为TRADE_SUCCESS");
                tbPaymentRecordsService.aliPaySuccess(returnPay);
            }
            response.getWriter().write("success");
        }
    }

    首先需要注意的是,这个类只能被@Controller注释修饰,不能用@RestController,因为@RestController会将该类中所有方法的返回值自动转为json格式,而此处支付宝的返回值不需要json格式。这里因为线上环境不能debug,我打印了大量的日志以监控该方法的运行情况。在支付的回调方法中,首先要做的就是验证签名,所以刚进入方法首先调用了PayUtil.checkSign(req)这个验证签名的方法,我们来看看这个checkSign(req)里面是怎么写的:

    /**
         * 支付宝的验签方法
         * @param req
         * @return
         */
        public static boolean checkSign(HttpServletRequest req) {
            Map<String, String[]> requestMap = req.getParameterMap();
            Map<String, String> paramsMap = new HashMap<>();
            requestMap.forEach((key, values) -> {
                  String strs = "";
                  for(String value : values) {
                  strs = strs + value;
                  }
                  System.out.println(("key值为"+key+"value为:"+strs));
                  paramsMap.put(key, strs);
                });
    
            //调用SDK验证签名
            try {
                return  AlipaySignature.rsaCheckV1(paramsMap, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type);
            } catch (AlipayApiException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                System.out.println("*********************验签失败********************");
                return false;
            }
        }

    首先我们先看最下面: AlipaySignature.rsaCheckV1(paramsMap, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type);这句话是调用支付宝给我们封装的验证签名的方法,右键指上去,会发现该方法的描述是这个样子的:

    boolean com.alipay.api.internal.util.AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String signType) throws AlipayApiException

    看到Map

    package com.avie.ltd.entity;
    
    import java.io.Serializable;
    
    public class AliReturnPayBean  implements Serializable{
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
    
        /**
         * 开发者的app_id
         */
        private String app_id;
    
        /**
         * 商户订单号
         */
        private String out_trade_no;
    
        /**
         * 签名
         */
        private String sign;
    
        /**
         * 交易状态
         */
        private String trade_status;
    
        /**
         *  支付宝交易号
         */
        private String trade_no;
    
        /**
         * 交易的金额
         */
        private String total_amount;
    
        public String getTotal_amount() {
            return total_amount;
        }
    
        public void setTotal_amount(String total_amount) {
            this.total_amount = total_amount;
        }
    
        public String getApp_id() {
            return app_id;
        }
    
        public void setApp_id(String app_id) {
            this.app_id = app_id;
        }
    
        public String getOut_trade_no() {
            return out_trade_no;
        }
    
        public void setOut_trade_no(String out_trade_no) {
            this.out_trade_no = out_trade_no;
        }
    
        public String getSign() {
            return sign;
        }
    
        public void setSign(String sign) {
            this.sign = sign;
        }
    
        public String getTrade_status() {
            return trade_status;
        }
    
        public void setTrade_status(String trade_status) {
            this.trade_status = trade_status;
        }
    
        public String getTrade_no() {
            return trade_no;
        }
    
        public void setTrade_no(String trade_no) {
            this.trade_no = trade_no;
        }
    
        @Override
        public String toString() {
            return "AliReturnPayBean [app_id=" + app_id + ", out_trade_no=" + out_trade_no + ", sign=" + sign
                    + ", trade_status=" + trade_status + ", trade_no=" + trade_no + "]";
        }
    
    
    }

    将返回参数封装在实体bean中,这样springmvc会利用反射机制自动将相关参数映射进实体bean里面,省去了我们自己再去解析参数的麻烦。后面那句returnPay.getTrade_status().equals(“TRADE_SUCCESS”)是得到支付宝中trade_status这个参数,在支付宝的接口文档中,若这个参数等于TRADE_SUCCESS,则说明支付是成功的,然后我就会调用tbPaymentRecordsService.aliPaySuccess(returnPay);。这句代码就是具体的业务逻辑代码了,对成功返回的参数进行处理,由于每个人业务逻辑都不一样,我就不再赘述了。你们只需将这局代码替换成你们的业务逻辑代码即可。

    这样,支付下单的流程就走通了。当然我还有一个退款的接口没讲。这个接口其实和下单接口大同小异,我也写了相关注释。就请各位自行阅读,我就不做解释了。

    那这次支付宝的调用就先写到这里,下次我还会写一些关于微信的支付接口,喜欢的小伙伴可以点波关注哦。

    展开全文
  • 这里的RSA2密钥最好设置下,我已经设置好了,所以便有了支付宝公钥(公钥是对外公开的,私钥是自己保留的具体的不多做解释) 至于RSA2密钥的生成,可参考如下操作:...

    1. 前期准备沙箱环境

    在这里插入图片描述

    这里的RSA2密钥最好设置下,我已经设置好了,所以便有了支付宝公钥(公钥是对外公开的,私钥是自己保留的具体的不多做解释)

    至于RSA2密钥的生成,可参考如下操作:https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=105971&docType=1
    在这里插入图片描述
    私钥保留,公钥设置到开发者平台RSA2上便可以了。

    具体如何使用沙箱环境:https://docs.open.alipay.com/200/105311/

    2. 获取电脑网站支付SDK&Demo

    地址:https://docs.open.alipay.com/270/106291/
    在这里插入图片描述
    接下来按照原来的目录复制到你的项目中,包括jar包
    在这里插入图片描述
    在这里插入图片描述

    修改配置和代码

    1. AlipayConfig.java
    package com.alipay.config;
    
    public class AlipayConfig {
        // 商户appid
        public static String APPID = "";
        // 私钥 pkcs8格式的
        public static String RSA_PRIVATE_KEY = "私钥";
        // 服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
        public static String notify_url = "http://localhost:8080/项目名/notify_url.jsp";
        // 页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址
        public static String return_url = "http://localhost:8080/项目名/return_url.jsp";
        // 请求网关地址
        public static String URL = "https://openapi.alipaydev.com/gateway.do";
        // 编码
        public static String CHARSET = "UTF-8";
        // 返回格式
        public static String FORMAT = "json";
        // 支付宝公钥
        public static String ALIPAY_PUBLIC_KEY = "";
        // 日志记录目录
        public static String log_path = "C:\\";
        // RSA2
        public static String SIGNTYPE = "RSA2";
    }
    
    
    1. jsp代码,有错的
    	AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
    
    

    在这里插入图片描述
    改成响应的大写,还有其他的页面也可以改了。
    在这里插入图片描述

    运行

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    大功告成

    如果想要改成自己想要的效果,请自行修改。

    展开全文
  • 支付宝WAP支付接口开发 因项目需要,要增加支付宝手机网站支付功能,找了支付宝的样例代码和接口说明,折腾两天搞定,谨以此文作为这两天摸索的总结。由于公司有自己的支付接口,并不直接使用这个接口,所以晚...
  • APP支付接口API https://opendocs.alipay.com/apis/api_1/alipay.trade.app.pay 开发准备工作 参考文档:https://opendocs.alipay.com/open/204/105297 后端代码实现 参数配置 application.yml # 支付宝相关 ALIPAY:...
  • 最近市面上很受欢迎的网银支付接口也比较稳定的网银接口就属,支付宝包装的网银接口了,目前市面上三方网银接口能够去用的不多几乎很少,也很难去寻找一条稳定的通道。 废话不多说下面就进入正题,既然能通过支付宝...
  • 最近项目APP需要接入微信、支付宝支付功能,在分配开发任务时,听说微信支付接口比支付宝支付接口要难实现,由于我开发经验不是那么丰富(现工作经验1年半)且未接触过支付接口开发,组里刚好又有支付接口的老司机,...
  • 支付宝APP支付服务端详解前面接了微信支付,相比微信支付支付宝APP支付提供了支付分装类,下面将实现支付宝APP支付、订单查询、支付结果异步通知、APP支付申请参数说明,以及服务端返回APP端发起支付的签名、商户...
  • 支付宝支付对接DEMO

    2019-04-24 20:24:42
    支付宝同步通知本地浏览器进行重定向操作,主要给用户展示支付宝支付结果是否成功,不会处理订单状态 ❷异步通知 支付宝服务器使用httpclient技术调用你的接口进行通知,支付宝把支付结果以报文方式给你,你进行解析...
  • 微信公众号:支付宝支付 微信公众号:支付宝支付 由于支付宝月微信是两个对立的企业,支付宝想介入微信的充值,微信发现就将其规避,在支付宝与微信博弈的过程中,双方一直是处于你争我赶的地步。 微信公众号接入...
  • 银联支付,支付宝支付,微信支付的三大总结,之前也有写过两篇。&amp;gt; 支付宝植入总结: android 支付宝的植入 《曾经踩过的坑》 微信支付总结: Android 微信支付总结 备注:出于安全考虑...
  • Java - 支付宝支付

    2020-06-29 15:24:09
    APP支付适用于商家在 App 应用中集成支付宝支付功能。 商家APP调用支付宝提供的 SDK,SDK 再调用支付宝APP内的支付模块。如果用户已安装支付宝 APP,商家 APP 会跳转到支付宝中完成支付,支付完后跳回到商家APP内,...
  • 网站调用支付宝进行支付-Java后台调用支付宝支付 最近公司一个产品用到了打赏支付,其中一个是支付宝,记录一下java后台调用支付宝的过程付代码。本文讲的是使用沙箱环境(支付宝提供的一种开发专用模式,不要实际...
  • 支付宝请求回来的数据是一个表单所以要在自己本身打开一个新的窗口然后把请求的数据写入然后打开支付宝支付 pc是扫码界面、手机上如果有支付宝直接拉起支付宝、没有支付宝直接网页支付 送上一波福利 微信公众号...
  • 一、场景:公司需要在网站上进行支付宝支付。 二、API:使用支付宝开放平台的支付能力-即时到账接口。支付宝开放平台链接 三、分析: 1、支付宝的文档比较容易看,主要是有相应的DEMO,我这里看的DEMO是 JAVA-UTF-8...
  • 目前项目中比较常用的第三方支付无非就是支付宝支付和微信支付。下面介绍一下Vue中H5页面如何使用支付宝支付。其实很简单的,只不过是调自己后台的一个接口而已(后台根据支付宝文档,写好支付接口)。 触发支付宝...
1 2 3 4 5 ... 20
收藏数 113,020
精华内容 45,208
关键字:

支付宝支付