支付宝Wap支付你了解多少?

此项目已开源欢迎Start、PR、发起Issues一起讨论交流共同进步
https://github.com/Javen205/IJPay
http://git.oschina.net/javen205/IJPay

上几篇文章详细介绍了支付宝APP支付微信APP支付

此文章来介绍下支付宝Wap支付(也叫作手机网站支付)

目录
1、创建应用并获取APPID
2、配置应用环境
3、配置沙箱环境
4、服务端实现(Maven添加本地Jar包、集成并配置SDK)

先上官方文档入口,支付宝文档入口模仿微信最最近做了更新,变得更简洁明了。

官方手机网站支付快速接入文档

1、创建应用并获取APPID

这个比较简单可以参考《开放平台应用创建指南》

2、配置应用环境

开发者调用接口前需要先生成RSA密钥,RSA密钥包含应用私钥(APP_PRIVATE_KEY)、应用公钥(APP_PUBLIC_KEY)。生成密钥后在开放平台管理中心进行密钥配置,配置完成后可以获取支付宝公钥(ALIPAY_PUBLIC_KEY)。详细步骤请参考《配置应用环境》

为了方便开发者生成一对RSA密钥支付宝提供一键生成工具,具体如何生成与配置密钥详见签名专区

WINDOWS
MAC_OSX

下载该工具后,解压打开文件夹,运行“RSA签名验签工具.bat”(WINDOWS)或“RSA签名验签工具.command”(MAC_OSX)。

以下演示截图

Window 配置应用环境生成相关Key截图参考上篇文档支付宝APP支付

以下是Mac电脑生成RSA密钥工具截图

工具生成一对RSA密钥之后将公钥配置到应用环境。
生成的私钥需妥善保管,避免遗失,不要泄露。应用私钥需填写到代码中供签名时使用。应用公钥需提供给支付宝账号管理者上传到支付宝开放平台。

3、配置沙箱环境

注意:沙箱环境的密钥最好与正式上线的应用进行区分避免一些不必要的麻烦。WAP支付支持沙箱环境而app支付不支持沙箱环境

官方介绍质料-箱环境使用说明

上传对应的公钥,沙箱账号待会在测试的时候回使用到

4、服务端实现(集成并配置SDK)

官方资源下载地址

服务端SDK下载与简介

Maven项目中使用本地JAR包

1、首先我在项目根目录中创建一个lib文件夹,将jar包拷贝到lib文件夹下

2、然后我们在maven的pom.xml中配置

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>20161129201425</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/alipay-sdk-java20161129201425.jar</systemPath>
</dependency>

3、这里的groupId和artifactId以及version都是可以随便填写的 ,scope必须填写为system,而systemPath我们现在我们jar包的地址就可以了

4、最后我们必须在maven打包的过程中加入我们这个jar包。因为项目运行的时候需要这个Jar,并且我们得拷贝在WEB-INF/lib目录下

<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
    <webResources>
        <resource>
            <directory>${project.basedir}/lib</directory>
            <targetPath>WEB-INF/lib</targetPath>
            <filtering>false</filtering>
            <includes>
                <include>**/*.jar</include>
            </includes>
        </resource>
    </webResources>
</configuration>
<version>2.1.1</version>
集成

在使用SDK调用具体API前,需要先配置通用接入参数

1、APP_ID 使用沙箱模式中的APP_ID.
2、APP_PRIVATE_KEY ALIPAY_PUBLIC_KEY 使用文章2、配置应用环境中生成的测试密钥.
3、CHARSET 默认使用UTF-8

然后,使用上述接入参数初始化AlipayClient:

AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",APP_ID,APP_PRIVATE_KEY,"json",CHARSET,ALIPAY_PUBLIC_KEY);

接下来,就可以用alipayClient来调用具体的API了。alipayClient只需要初始化一次,后续调用不同的API都可以使用同一个alipayClient对象。

手机网站支付不支持第三方授权,不能代商家发起请求。

调用接口

手机网站支付产品包含两类API:
页面跳转类:需要从前端页面以Form表单的形式发起请求,浏览器会自动跳转至支付宝的相关页面(一般是收银台或签约页面),用户在该页面完成相关业务操作后再回跳到商户指定页面。例如本产品中的手机网站支付接口alipay.trade.wap.pay

系统调用类:直接从服务端发起HTTP请求,支付宝会同步返回请求结果。例如本产品中的交易查询等配套API。

调用流程图

使用SDK快速接入

手机网站支付alipay.trade.wap.pay:
对于页面跳转类API,SDK不会也无法像系统调用类API一样自动请求支付宝并获得结果,而是在接受request请求对象后,为开发者生成前台页面请求需要的完整form表单的html(包含自动提交脚本),商户直接将这个表单的String输出到http response中即可。

public void doPost(HttpServletRequest httpRequest,
                      HttpServletResponse httpResponse) throws ServletException, IOException {
    AlipayClient alipayClient = ... //获得初始化的AlipayClient
    AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//创建API对应的request
    alipayRequest.setReturnUrl("http://domain.com/CallBack/return_url.jsp");
    alipayRequest.setNotifyUrl("http://domain.com/CallBack/notify_url.jsp");//在公共参数中设置回跳和通知地址
    alipayRequest.setBizContent("{" +
        "    \"out_trade_no\":\"20150320010101002\"," +
        "    \"total_amount\":88.88," +
        "    \"subject\":\"Iphone6 16G\"," +
        "    \"seller_id\":\"2088123456789012\"," +
        "    \"product_code\":\"QUICK_WAP_PAY\"" +
        "  }");//填充业务参数
    String form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
    httpResponse.setContentType("text/html;charset=" + AlipayServiceEnvConstants.CHARSET);
    httpResponse.getWriter().write(form);//直接将完整的表单html输出到页面
    httpResponse.getWriter().flush();
}
异步通知验签
Map<String, String> paramsMap = ... //将异步通知中收到的所有参数都存放到map中
boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, ALIPAY_PUBLIC_KEY, CHARSET) //调用SDK验证签名
if(signVerfied){
    // TODO 验签成功后,按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验,校验成功后在response中返回success并继续商户自身业务处理,校验失败返回failure
}else{
    // TODO 验签失败则记录异常日志,并在response中返回failure.
}
服务端具体封装

将参数独立配置在一个属性文件中方便管理,当然也可以从数据库

加载接入参数并初始化AlipayClient

使用SDK快速接入代码封装


public void wapPay(){
        String body="我是测试数据";
        String subject="Iphone6 16G";
        String total_amount="0.01";
        String passback_params="1";

        BizContent content = new BizContent();
        content.setBody(body);
        content.setOut_trade_no(OrderInfoUtil2_0.getOutTradeNo());;
        content.setPassback_params(passback_params);
        content.setSubject(subject);
        content.setTotal_amount(total_amount);
        content.setProduct_code("QUICK_WAP_PAY");

        try {
            AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//创建API对应的request
            alipayRequest.setReturnUrl("http://javen.tunnel.qydev.com/alipay/return_url");
            alipayRequest.setNotifyUrl("http://javen.tunnel.qydev.com/alipay/notify_url");//在公共参数中设置回跳和通知地址
            //参数参考 https://doc.open.alipay.com/doc2/detail.htm?treeId=203&articleId=105463&docType=1#s0
            System.out.println(JsonKit.toJson(content));
            alipayRequest.setBizContent(JsonKit.toJson(content));//填充业务参数
                String form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
                HttpServletResponse httpResponse = getResponse();
                httpResponse.setContentType("text/html;charset=" + charset);
                httpResponse.getWriter().write(form);//直接将完整的表单html输出到页面
                httpResponse.getWriter().flush();
        } catch (Exception e) {
            e.printStackTrace();
        }

        renderNull();
    }
public void return_url() {
        try {
            // 获取支付宝GET过来反馈信息
            Map<String, String> map = AliPayApi.toMap(getRequest());
            for (Map.Entry<String, String> entry : map.entrySet()) {
                System.out.println(entry.getKey() + " = " + entry.getValue());
            }

            boolean verify_result = AlipaySignature.rsaCheckV1(map, AliPayApi.ALIPAY_PUBLIC_KEY, AliPayApi.CHARSET,
                    AliPayApi.SIGN_TYPE);

            if (verify_result) {// 验证成功
                // TODO 请在这里加上商户的业务逻辑程序代码
                System.out.println("return_url 验证成功");
                renderText("success");
                return;
            } else {
                System.out.println("return_url 验证失败");
                // TODO
                renderText("failure");
                return;
            }
        } catch (AlipayApiException e) {
            e.printStackTrace();
            renderText("failure");
        }
    }
public void notify_url() {
        try {
            // 获取支付宝POST过来反馈信息
            Map<String, String> params = AliPayApi.toMap(getRequest());

            for (Map.Entry<String, String> entry : params.entrySet()) {
                System.out.println(entry.getKey() + " = " + entry.getValue());
            }

            boolean verify_result = AlipaySignature.rsaCheckV1(params, AliPayApi.ALIPAY_PUBLIC_KEY, AliPayApi.CHARSET,
                    AliPayApi.SIGN_TYPE);

            if (verify_result) {// 验证成功
                // TODO 请在这里加上商户的业务逻辑程序代码
                System.out.println("notify_url 验证成功succcess");
                renderText("success");
                return;
            } else {
                System.out.println("notify_url 验证失败");
                // TODO
                renderText("failure");
                return;
            }
        } catch (AlipayApiException e) {
            e.printStackTrace();
            renderText("failure");
        }
    }
/**
     * 将异步通知的参数转化为Map
     * @param request
     * @return
     */
    public static Map<String, String> toMap(HttpServletRequest request) {
        Map<String, String> params = new HashMap<String, String>();
        Map<String, String[]> requestParams = request.getParameterMap();
        for (Iterator<String> 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] + ",";
            }
            // 乱码解决,这段代码在出现乱码时使用。
            // valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            params.put(name, valueStr);
        }
        return params;
    }

此项目源码【下载地址

测试

下载部署如果没有做任何修改默认的分别为:
测试地址:http://域名或者IP/alipay/wapPay
回跳地址:http://域名或者IP/alipay/return_url
通知地址:http://域名或者IP/alipay/notify_url

测试截图

推荐阅读
Android版-微信APP支付
极速开发微信公众号之微信买单
极速开发微信公众号之公众号支付
极速开发微信公众号之扫码支付
极速开发微信公众号之刷卡支付
极速开发微信公众号之现金红包
Android版-支付宝APP支付

记录学习的点滴,以此勉励不断奋斗的自己️️️ 如果对你有帮助记得点喜欢

源码下载地址

时间: 2024-08-17 20:18:28

支付宝Wap支付你了解多少?的相关文章

微信、支付宝App支付-JPay 简单而不简洁的App支付SDK

JPay 对微信App支付.支付宝App支付的二次封装,对外提供一个相对简单的接口以及支付结果的回调 GitHub:https://github.com/Javen205/JPay OsChina:http://git.oschina.net/javen205/JPay 使用方法 1.引入 compile 'com.javen205.jpay:jpaysdk:latest.release.here' 2. Android Manifest配置 2.1权限声明 <uses-permission a

有谁同时做过支付宝手机wap支付和移动支付的?

问题描述 有谁同时做过支付宝手机wap支付和移动支付的? 获取Key和ID页面,合作者秘钥管理和无线产品秘钥管理里面的公钥是如何填写?填写哪个的公钥?是都填写支付宝手机wap支付的公钥还是移动支付的公钥?

支付宝 手机wap支付接口问题

问题描述 支付宝 手机wap支付接口问题 同步请求一直403错误,把同步地址设置成baidu取出参数,然后本地测发现参数里面的notify time = 2015-09-09+09%3A08%3A17 这个去掉就正常,什么原因? 解决方案 403是禁止访问,应该是你的请求中有参数不对,或缺少对应的信息,没有通过验证 解决方案二: 试一下把url用base64编码

Laravel使用支付宝进行支付开发实例

首先我们来探讨如何在Laravel应用中使用支付宝进行支付,对此,GitHub上有很多相关的包,这里我们介绍其中最流行的两个包:Omnipay For Laravel 5 & Lumen 和 Laravel AliPay. 1.使用 OmniPay For Laravel 5 & Lumen 引言&简介 在开始之前,我们先来了解下OmniPay这个GitHub项目. OmniPay是一个独立于框架的.对多种网关支付处理提供支持的PHP库.其介绍网站是http://omnipay.t

支付宝-android 支付功能上的问题

问题描述 android 支付功能上的问题 如果只是单纯的支付,是不是就是调用一下支付接口就可以了,如果调用微信支付或者支付宝的支付是调用微信和支付宝的接口么 解决方案 每一种支付都有自己的sdk,你要用就要嵌入进来,并调用相关接口,你可以自己封装一个html5的后台支付,你前端直接调用这个url就行,或者使用第三方支付平台,里面正好好了各种支付 解决方案二: 调用第三方的,一般都提供了详细使用方法,. 解决方案三: 下载支付平台提供的SDK,并仔细阅读它提供的使用教程文档,很容易实现支付功能的

继东航之后,国航、南航也开通了支付宝快捷支付

今后,用户在国航.南航官网购票,只要输入支付宝账户与支付密码就可一步完成付款,最多可为用户节省了六成的购票时间. 目前,国内已有16家航空公司实现快捷支付购票服务,而携程.淘宝旅行等大型商旅平台也早已支持快捷支付购物. 据了解,此前用户在航空公司官网购买直销机票,需要使用网银方式付款,不仅操作流程繁琐,且还易受木马钓鱼威胁.而开通支付宝快捷支付应用后,用户在航空公司网官购票付款时,只要输入支付密码和手机短信动态口令可一步完成,轻松便捷. 据航空业人士统计,在航空在线机票直销中,用户使用快捷支付的

渣打与支付宝联合推出“渣打银行-支付宝快捷支付”服务

信报讯(记者杨小丹)昨日,渣打中国与支付宝联合推出"渣打银行-支付宝快捷支付"服务,持有渣打中国借记卡的客户,可在支付宝所支持的淘宝网.天猫及各大特约商户上进行网上支付. 目前,半数以上的支付宝B2C大商户都已经开通了与渣打银行的支付服务.支付宝表示,用户无需事先开通网银,首次付款只要根据提示输入卡号.手机验证码等必要信息就可以简单.方便地完成网上支付. 此前,支付宝刚刚宣布正式为中国消费者在境外网站购物提供快捷支付服务,覆盖全球34个国家和地区,支持包括英镑.美元.瑞士法郎.欧元在内

ios 支付宝网页支付 总是显示参数错误是怎莫回事

问题描述 ios 支付宝网页支付 总是显示参数错误是怎莫回事 partner="2088811116320160"&seller_id="jms@jimaisong.com"&out_trade_no="7TC5SNSTPWZBMP8"&subject="哇哈哈"&body="有营养"&total_fee="0.10"&notify_url

支付宝移动支付开放 每天交易超2500万笔

新浪科技讯 3月20日晚间消息,据支付宝方面今日透露,今年3月以来支付宝手机支付规模每天达 2500万笔以上,超过2012年支付宝每天日常交易的总数.据悉, 2009年支付宝开放其支付系统,与支付宝合作的商家可自由选择Html5.移动快捷.SDK等收银台以及支付宝钱包向用户收款.随后在2013年,支付宝又开发了SDK组件对外开放.目前,包括新浪微博.好乐买.拉手网.窝窝团等数十家厂商用户可直接绑定支付宝进行支付.当下,手机支付已成为国内互联网与金融行业增长最快的几个细分市场之一.此前,中国银行业