支付宝api指南
1.业务模型分析
通过支付宝提供的Webservice接口,可以调用支付宝(https://www.alipay.com)提供的服务,这些服务在中有详细说明。

在这些服务中,服务类型大致可以分为以下几类:

WebService查询服务:通过服务器后台发起一个http请求,然后从服务器上返回一个Xml类型的返回结果。比如,user_query 服务,支付宝id 或者支付宝的账户email通过服务器后台查询一个支付宝会员信息。
带有页面跳转的交互服务:用户在实现一个web功能的过程中需要调用到支付宝的几个web页面作为,服务流程中的一部分。比如,user_authentication服务需要调用支付宝的一个用户认证页面。Custome_sign 需要使用支付的代扣协议签订页面。另外,在支付宝协作页面跳转回原页面的时候,需要对参数签名进行验证,或者对notifyId进行验证是否是合法的web回调请求。2.业务场景分析

现在支付宝提供的这些服务接口,调用端只能通过查询支付宝提供api文档,通过api文档进行接口开发。

偶在开发口碑卡项目中需要用到user_query,user_authentication,customer_sign等支付宝服务,以前,口碑的业务也有调用过支付宝的接口,于是我就想重用以前其他同学已经写过的调用支付宝服务的代码。结果发现,有很多参数已经写死了,比如key,partnerid,还有sign的算法。所以代码根本没有办法重用,只能ctrl+C加ctrl+V,而且我在开发过程中为了解决参数签名匹配不上的问题搞了很长时间。

所以,我认为应该开发一个类似淘宝TOP平台提供的API代码接口,这个api接口的开发难度比淘宝open api 应该简单,因为,在和支付宝交互的数据结构比较简单。
2.1.Api所要实现的目标

解决参数签名,调用支付宝服务过程中,参数签名的作用是保证用户请求的参数没有被黑客截取篡改参数值,在所有的请求中都会有参数签名。为了代码实现简单,先默认参数签名方式为MD5签名。参数签名应该像面向切面编程一样,在开发一个具体的结果过程中程序员不用关心参数签名,这也是做这个框架的重要意义所在。当初,我照着api文档的时候为了参数签名真是折腾了好长时间,为了避免其他同学重蹈我的覆辙。必须要将参数签名封装成一个模块能够重复调用。
2.2.支持多种字符集

这个API框架能够在多种字符集环境下使用,所以这个框架要能够支持UTF8,GBK等多种环境,只需要简单配置就能切换。
2.3.新功能容易扩充

现在实现的接口还只是支付宝提供的所有web服务中的小部分,但是已经涵盖到了所有前面提到的所有种类的服务(服务器后台请求,协同页面),如果想通过此框架实现其余的页面只需要实现少部分代码就能实现功能。
3. 实现
3.1.整体类图
3.2.核心类
3.2.1 BasicAlipayToolkit

该类是所有支付宝服务的基类,他提供了一些所有服务接口都要调用的方法。

方法有:

urlEncode()将传输的值进行编码,按照GBK或者UTF8或者其他编码格式进行编码。
sign()将传输的参数集合进行签名
getPartner()取得支付宝分配给用户的partnerid

3.2.2.AlipayApply

支付宝的所有web服务都是通过http协议请求发送的,通过这个类可以通过用户设置的一些基本的参数组装出发送给支付宝的http的url,如果当请求是在页面中需要使用标签来发送的话,就可以通过buildSubmitForm方法生成一个html的form表单。

这些方法有:

 prepareParamMap()将除partner,_input_charset,service参数字段放到map的数据结构中。
 buildSubmitForm()创建出一个from表单,可以在html页面中使用,用于在想支付宝发起请求。
 getPayGateWay()取得支付宝请求地址,如https://www.alipay.com/cooperate/gateway.do
 buildHref()取得向支付宝请求的url。

3.2.3 BasicWebServiceApply

getMapResult()解析支付宝远端的返回的XML结果,封装成一个pojo对象。
getValueElementName()设置支付宝返回结果中代表结果值的xml节点名称。
createResult()创建一个远端结果对象。
resultCallback()返回一个结果之后设置返回结果对象的值。

3.2.4 Profile,DefaultProfile

支付宝服务请求的用户信息封装,能够取到PartnerId和getGateway,不同的用户需要通过调用。
[java] view plaincopy

    Profile profile = new DefaultProfile("adfasdfasdq24234sdf3434","http://aliapi.alipay.net/gateway.do"
,"2088101010199999");
BasicAlipayToolkit.setProfile(profile);

3.3. 时序图分析

支付宝提供了两种服务,webService和页面协作,根据两种服务类型,选取两个服务分析一下服务的流程。
3.3.1 user_query服务

单元测试Test启动,调用BasicAlipayToolkit的静态方法setProfile()设置连接需要用到的key,gateway,和partnerid
调用者设置查询参数,然后调用getAlipayPojo方法,向支付宝发起查询请求。
支付宝返回查询结果对象AlipayQuery调用getMapResult()生成查询结果
封装查询结果的过程中先要生成包装查询结果的对象。
创建查询结果
根据支付宝返回的结果设置查询结果是否成功
如果查询有错误的话设置错误编码
没够成功拿到查询结果,设置查询结果对象的属性值

3.4. 功能说明
3.4.1.支付宝会员登陆验证

用户需要通过支付宝认证用户信息,代码如下:
[java] view plaincopy

AlipayAuthenticateCooperate  cooperate =  return new AlipayAuthenticateCooperate(  "http://localhost/callbackUrl.html",  CharSet.GBK);

在页面上打印超链接
[xhtml] view plaincopy

<a href="<s:property escape="false" value="alipayAuthenticateCooperate.buildHref()" />">支付宝认证登录</a>

在页面上打印一个form表单

[xhtml] view plaincopy

<s:property  escape="false" value="alipayAuthenticateCooperate.buildSubmitForm(‘提交’)" />

当用户在支付宝用户认证之后,跳转到原网站页面,需要取得支付宝会员信息:
[java] view plaincopy

HttpServletRequest request = ServletActionContext.getRequest();  AlipayAuthenticateCallback authenticateCallback = new AlipayAuthenticateCallback(  CharSet.UTF8);  AlipayResult alipayResult = authenticateCallback  .getAlipayResult(request.getParameterMap());  if (!alipayResult.isSuccess()) {  throw new BizException("alipayResult is false,error code:"  + alipayResult.getErrorCode() + "request url:["  + request.getQueryString() + "]");}  String alipayid = alipayResult.getUserid();  AlipayAccount account = new AlipayAccount(alipayid, bizContext);  account.setAccountId(alipayid + "0156");  account.setEmail(alipayResult.getEmail());  account.setMobile(alipayResult.getMobile());

注意:在使用该服务api代码必要代码中设置的CharSet需要和当前tomcat URLencode要一致,否则,跳转会原页面会有sign不一致的问题。
3.4.2. 即时到帐

在页面中要发起一个即时到帐的请求,代码如下:
[java] view plaincopy

  AlipayPayment patment =  return new AlipayPayment("mozhenghua19811109@126.com",  "http://localhost/return_url.html",  "http://localhost/notify_url.html",  "http://localhost/showurl.html",
"123456", // out_trade_no
12f, //单价
3,//数量  CharSet.GBK,
Configuration.GetConfig("sellerEmail")// 卖家email账户
);  // 设置跳转的url
action.setRedirectUrl(String.valueOf(payment.buildHref()));

用户在支付宝完成即时到帐功能之后跳转到原页面
[java] view plaincopy

import com.koubei.kac.alipaytaobaocooperate.CallbackValidate;  llbackValidate validate = new CallbackValidate();  HttpServletRequest request = ServletActionContext.getRequest();  // 判断url sign 是否正确  if (!validate.isValidCallbackApply(request.getParameterMap())) {  getLog().error(  "is invalid callback request from alipay notfiyid:"  + this.getNotify_id()  + " out_trade_no[delivery_detail PK]:"  + this.out_trade_no);  // 跳转到错误页面  return getErrorResult();  }  if (!validate.isValidNotify(this.notify_id)) {  getLog().error(  "not valid notifyid, notify_id:" + this.notify_id  + " out_trade_no:" + out_trade_no  + " trade_status:" + trade_status);  // 非法请求跳转到错误页面  return getErrorResult();  }

3.4.3.CAE代扣协议

[java] view plaincopy

 CAEAlipayCooperate cooperate =
return new CAEAlipayCooperate(  "http://localhost/callback.html",  "http://localhost/notify.html",  "mozhenghua19811109@126.com", "CAE业务提交", CharSet.UTF8,bizCode
);  cooperate. buildHref();//生成cae代扣协议的url
// 结果:
/**
http://aliapi.alipay.net/gateway.do?sign_type=MD5&sign=d78ce0c98deabe389c0b05dabc1ae1c9&_input_charset=utf-8&customer_email=mozhenghua19811109%40<br /> 126.com&notify_url=http%3A%2F%2Fhangzhou.koubei.com%2Fka%2Fnotify.html&service=customer_sign&partner=2088101010199999&type_code=123456&return_url<br /> =http%3A%2F%2Fhangzhou.koubei.com%2Fka%2Fcallback.html
*/
cooperate.buildSubmitForm();//生成cae代扣协议提交的form表单
//结果:
/**
<form  method="post" action="http://aliapi.alipay.net/gateway.do?_input_charset=utf-8">  <input type="hidden" name="_input_charset" value="utf-8" /><br />
<input type="hidden" name="customer_email" value="mozhenghua19811109@126.com" /><br />
<input type="hidden" name="notify_url" value="http://localhost/notify.html"/><br />
<input type="hidden" name="service" value="customer_sign" /><br />
<input type="hidden" name="partner" value="2088101010159999" /><br />
<input type="hidden" name="type_code" value="123456" /><br />
<input type="hidden" name="return_url" value="http://localhost/callback.html" /><br />
<input type="hidden" name="sign" value="d78ce0c98deabe389c0b05dabc1ae1c9" />  <input type="hidden" name="sign_type" value="MD5" /> <input class<br />
="submitBtn" type="submit"  value="CAE业务提交"/> </form> */

用户完成支付宝代扣协议跳转到口碑页面
[java] view plaincopy

HttpServletRequest request = ServletActionContext.getRequest();  CallbackValidate validate = new CallbackValidate();  boolean isValidApply = validate.isValidCallbackApply(request  .getParameterMap(), new CallbackValidate.KeyIgnorJudgement() {  @Override  public boolean ignor(String key) {  return "sign".equalsIgnoreCase(key)  || "sign_type".equalsIgnoreCase(key)  || "action".equalsIgnoreCase(key);  }  });  // 非法请求  if (!isValidApply) {  return ERROR;  }  // 测试该请求是否合法  boolean isSuccess = "T".equalsIgnoreCase(request  .getParameter("is_success"));  if (!isSuccess) {  return "caesingerror";  }

支付宝接口实例one相关推荐

  1. PHP开发支付宝微信个人免签支付接口实例

    2019独角兽企业重金招聘Python工程师标准>>> 这是一个PHP开发支付宝微信个人免签支付接口实例,支付宝微信即时到帐接口,使用原生支付宝即时到帐接口修改而来,即可实现多接口收 ...

  2. ThinkPHP实现支付宝接口功能 代码实例

    我们这里用的是即时到帐的接口,具体实现的步骤如下: Table of Contents 1 一.下载支付宝接口包 2 二.重新整理接口包文件,这一步应该算是比较关键的(个人认为) 3 三.在项目中调用 ...

  3. 支付宝接口使用文档说明 支付宝异步通知

    支付宝接口使用文档说明 支付宝异步通知(notify_url)与return_url. 现支付宝的通知有两类.  A服务器通知,对应的参数为notify_url,支付宝通知使用POST方式  B页面跳 ...

  4. 网站集成支付宝接口安装教程

    拿到支付宝的接口代码后,尽管里面的程序有注释,接口代码包中也附有开发说明,但还是不知道该如何入手.这不难想象是什么原因,因为自己并不了解这个接口的工作原理是什么? 那么这篇文章就是要向大家全面展示关于 ...

  5. 支付宝接口程序、文档及解读(ASP.NET)

    支付宝接口程序.文档及解读(ASP.NET) 最近需要为网站加入支付宝的充值接口,而目前关于支付宝接口开发的资料比较杂乱,这里就我此次开发所用到的资料进行汇总整理,希望能够帮助需要的朋友. 开发步骤: ...

  6. 支付宝接口接入方法 步骤十分详细

    原文在支付宝的论坛,最近在做支付宝支付接口接入,虽然不是用主流的java/php/c#,用的是golang,但原理还是相通.原文连接:http://club.alipay.com/read.php?t ...

  7. 支付宝接口(扫码支付的原理)使用文档说明 支付宝异步通知(notify_url)与return_url.

    支付宝接口使用文档说明 支付宝异步通知(notify_url)与return_url. 现支付宝的通知有两类.  A服务器通知,对应的参数为notify_url,支付宝通知使用POST方式  B页面跳 ...

  8. 支付宝接口程序、文档及解读

    很早之前的一篇文章 ,记录下来 ,以备不时之需 最近需要为网站加入支付宝的充值接口,而目前关于支付宝接口开发的资料比较杂乱,这里就我此次开发所用到的资料进行汇总整理,希望能够帮助需要的朋友. 开发步骤 ...

  9. 支付宝 php rsa算法,:PHP支付宝接口RSA验证

    这两天一直困扰的PHP RSA签名验证问题终于解决了,由于之前RSA接触的不多,再加上官方至今还未有PHP的SDK可供参考,因此走了一些弯路,写在这里和大家分享. 虽然支付宝官方还未提供相关SDK,P ...

最新文章

  1. 分享Kali Linux 2016.2第43周虚拟机
  2. android四大组件五大存储六大布局,物联网研报:物联网进入规模化应用时代
  3. 二十年后的回眸(2)——顺风顺水的前三年
  4. Python 国产库推荐之 musicpy
  5. KnowIME: A System to Construct a Knowledge Graph for Intelligent Manufacturing Equipment-学习笔记
  6. mysql5717开发设置怎么调回来_华为手机这几个默认设置,一定要关闭,再也不卡顿...
  7. bootstrap 一排5个_BootStrap从基础到项目实战_第1季_03章_02_CSS样式栅格系统实例
  8. 使用fastapi时在py文件中无法正常引用
  9. 正则与pandas处理行数据
  10. A Detailed Explanation of the Detection and Processing of BigKey and HotKey in Redis
  11. 2021-08-27 向量究竟是什么?线性代数的本质,第1章
  12. php解析乱码字符串,php中文字符串截取方法防止乱码解析
  13. 5G接入网学习:回顾电调天线
  14. ThreadLocal的使用场景及使用方式
  15. Latex在线编辑器帮助文档
  16. 低代码平台要怎么选?便宜其实也有好货!
  17. 【开发随记】【提效】工作习惯那些事系列之三——邮件管理
  18. Vue Echarts世界地图
  19. PS - 图层显示索引不能做修改(将索引图层改为正常图层)
  20. hald进程 linux,linux进程不受终端影响

热门文章

  1. MATLAB二维平面绘图
  2. 三分钟给女票写个“彩虹屁”bot-node版本
  3. 20个公司绝对不会告诉你的潜规则[zz]
  4. java jdbc 无效的列名_java.sql.SQLException列名无效
  5. 2018世界物联网与智能制造高峰论坛圆满落幕,“未来制造”成为大会热词
  6. 小米6鲁大师html5评测,鲁大师曝光小米6跑分:这个分数满意吗?
  7. 奇葩公司规定之搞笑版(改编自真实规定)
  8. Proteus Design Suite v8.4 SP0 1CD PCB设计软件带高级模拟仿
  9. 英国电信官宣入华,三大运营商慌不慌?
  10. 自制wpf年会抽奖小软件