支付宝WAP支付总结

一:支付宝开放文档: 

支付宝手机网站支付的开发文档: https://docs.open.alipay.com/203html

二:配置应用环境: 

开发者调用接口前须要先生成RSA2密钥,RSA2密钥包含应用私钥(APP_PRIVATE_KEY)、应用公钥(APP_PUBLIC_KEY)。生成密钥后在开放平台管理中心进行密钥配置,配置完成后能够获取支付宝公钥(ALIPAY_PUBLIC_KEY)。此为一一对应。前端

 

生成好的公钥上传给支付宝,并记住支付对应的公钥。基础环境中的应用网关及受权回调地址须要开发者本身配置,前提是能够在外网有申请能够访问的。
 json

三:签约配置

自用型应用。将所须要的功能进行签约,商户签约须要营业执照,身份证等多种信息。api

 

签约完成后,应用申请上线。浏览器

 

四:手机网站快速接入,调用支付宝2.0版本

         第一步:搭建和配置开发环境app

      下载服务端SDKdom

第二步:调用接口异步

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

1页面跳转类:须要从前端页面以Form表单的形式发起请求,浏览器会自动跳转至支付宝的相关页面(通常是收银台或签约页面),用户在该页面完成相关业务操做后再回跳到商户指定页面。测试

2系统调用类:直接从服务端发起HTTP请求,支付宝会同步返回请求结果。

 

特别注意:

1.因为前台回跳的不可靠性,前台回跳只能做为商户支付结果页的入口,最终支付结果必须以异步通知或查询接口返回为准,不能依赖前台回跳。

2.商户系统接收到异步通知之后,必须经过验签(验证通知中的sign参数)来确保支付通知是由支付宝发送的。详细验签规则参考异步通知验签

3.接受到异步通知并验签经过后,必定要检查通知内容,包括通知中的app_id, out_trade_no, total_amount是否与请求中的一致,并根据trade_status进行后续业务处理。

五:使用SDK快速接入

1:手机网站支付alipay.trade.wap.pay:

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

1 AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2"); //得到初始化的AlipayClient
 2 AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//建立API对应的request
 3 alipayRequest.setReturnUrl("http://domain.com/CallBack/return_url.jsp");
 4 alipayRequest.setNotifyUrl("http://domain.com/CallBack/notify_url.jsp");//在公共参数中设置回跳和通知地址
 5 alipayRequest.setBizContent("{" +
 6 " \"out_trade_no\":\"20150320010101002\"," +
 7 " \"total_amount\":\"88.88\"," +
 8 " \"subject\":\"Iphone6 16G\"," +
 9 " \"product_code\":\"QUICK_WAP_PAY\"" +
10 " }");//填充业务参数
11 String form="";
12 try {
13 form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
14 } catch (AlipayApiException e) {
15 e.printStackTrace();
16 }
17 httpResponse.setContentType("text/html;charset=" + CHARSET);
18 httpResponse.getWriter().write(form);//直接将完整的表单html输出到页面
19 httpResponse.getWriter().flush();
20 httpResponse.getWriter().close();

2:支付异步通知验签:

1 Map<String, String> paramsMap = ... //将异步通知中收到的全部参数都存放到map中
2 boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, ALIPAY_PUBLIC_KEY, CHARSET, SIGN_TYPE) //调用SDK验证签名
3 if(signVerified){
4 // TODO 验签成功后,按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验,校验成功后在response中返回success并继续商户自身业务处理,校验失败返回failure
5 }else{
6 // TODO 验签失败则记录异常日志,并在response中返回failure.
7 }

3:交易退款接口alipay.trade.refund

1 AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2"); //得到初始化的AlipayClient
2 AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();//建立API对应的request类
3 request.setBizContent("{" +
4 " \"out_trade_no\":\"20150320010101001\"," +
5 " \"trade_no\":\"2014112611001004680073956707\"," +
6 " \"out_request_no\":\"1000001\"," +
7 " \"refund_amount\":\"2014112611001004680073956707\"" +
8 " }");//设置业务参数
9 AlipayTradeRefundResponse response = alipayClient.execute(request);//经过alipayClient调用API,得到对应的response类

六:注意事项(特别注意,SDK新加的)

1.在内网须要访问外网的时候,须要使用代理路径。在退款时候调用SDK,须要调用新的重构方法。

1 public DefaultAlipayClient(String serverUrl, String appId, String privateKey, String format,  String charset, String alipayPublicKey, String signType,String proxyHost, int proxyPort) {
2 
3         this(serverUrl, appId, privateKey, format, charset, alipayPublicKey, signType);
4 
5         this.proxyHost = proxyHost;
6 
7         this.proxyPort = proxyPort;
8 
9 }

复制代码

2.心得:时刻关注官方的文档,当发现官方所提供的不支持本身须要时,需想官方提交问题,等待支付宝那边将官网文档完善。

3.在测试支付宝支付退款时候,选择沙箱环境进行验证,沙箱路径与真实的网关路径十分类似,写网关的时候注意路径是否正确。需保管好本身的沙箱帐户。

相关文章
相关标签/搜索