支付宝支付-PC电脑网站支付
支付产品全面升级(更新时间:2017/05/05 ),若您使用的是老接口,请移步老版本即时到账文档。
支持沙盒环境的测试
此项目已开源欢迎Start、PR、发起Issues一起讨论交流共同进步
https://github.com/Javen205/IJPay
http://git.oschina.net/javen205/IJPay
1、有图有真相
使用手机扫码进行支付
PC 端登录账号进行支付
2、如何申请PC电脑网站支付
费率、申请条件、签约、使用场景 传送门接入指引
3、如何快速接入PC电脑网站支付
如果你是使用新版本接入就比较方便了,因为官方提供了开放平台服务端SDK
3.1 接口调用流程图
主要涉及到的接口有:
交易关闭接口alipay.trade.close
查询对账单下载地址查询接口alipay.data.dataservice.bill.downloadurl.query
3.2 支付接口alipay.trade.page.pay封装
初始化接口
static {
alipayClient = new DefaultAlipayClient(SERVICE_URL, APP_ID, PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);
}
封装支付接口并将SDK生成的表单响应给页面
/**
* 电脑网站支付(PC支付)
* @param model
* @param notifyUrl
* @param returnUrl
* @return
* @throws AlipayApiException
* @throws IOException
*/
public static void tradePage(HttpServletResponse httpResponse, AlipayTradePayModel model, String notifyUrl, String returnUrl) throws AlipayApiException, IOException{
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setBizModel(model);
request.setNotifyUrl(notifyUrl);
request.setReturnUrl(returnUrl);
String form = alipayClient.pageExecute(request).getBody();//调用SDK生成表单
httpResponse.setContentType("text/html;charset=" + CHARSET);
httpResponse.getWriter().write(form);//直接将完整的表单html输出到页面
httpResponse.getWriter().flush();
httpResponse.getWriter().close();
}
3.3 其他支付接口封装
可以参考 支付宝支付-常用支付API详解(查询、退款、提现等)
3.4 封装测试
/**
* PC支付
*/
public void pcPay(){
try {
String totalAmount = "88.88";
String outTradeNo =StringUtils.getOutTradeNo();
log.info("pc outTradeNo>"+outTradeNo);
String returnUrl = AliPayApi.NOTIFY_DOMAIN + "/alipay/return_url";
String notifyUrl = AliPayApi.NOTIFY_DOMAIN + "/alipay/notify_url";
AlipayTradePayModel model = new AlipayTradePayModel();
model.setOutTradeNo(outTradeNo);
model.setProductCode("FAST_INSTANT_TRADE_PAY");
model.setTotalAmount(totalAmount);
model.setSubject("Javen PC支付测试");
model.setBody("Javen IJPay PC支付测试");
AliPayApi.tradePage(getResponse(),model , notifyUrl, returnUrl);
} catch (Exception e) {
e.printStackTrace();
}
}
异步通知处理
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");
}
}
同步商户页面验签,这里只是返回验签的状态
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");
}
}
将参数转化为Map,为验签做准备
/**
*
* @param request
* @return
*/
public static Map<String, String> toMap(HttpServletRequest request) {
System.out.println(">>>>" + request.getQueryString());
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;
}
4、测试数据
异步通知的参数
gmt_create = 2017-05-14 13:26:58
charset = UTF-8
notify_time = 2017-05-14 13:28:04
gmt_payment = 2017-05-14 13:28:03
subject = Javen PC支付测试
sign = ZYQO+lzxAMDj8Al25KoJzSXegrx1rriBMGLOAEyiNHEac0OMe5e49ZW6m0waDSmTBDX8bwEHUjAk8rdCXTXPzNQSVP0p+46V+8k9AHiEiom6OzV3ZTLzGXGw8A8lnrGPYeCDmKSa3pogJKP0Ob7PyBRgz4HWydWC4P+G1yYEjvVX8kK2XbM6bMauW23a0AklvZbve6WUwUpkioMNLCOHAQzPBDW/LaoDUGx6GN6f3sFDsomBJ03w9rJgqZCs1zw29HHIW4kNFrLcQFleaC+2NnNPLhVanH1iXcK8800dsOXagRPuoy9Gr2EYGV+hSOiVE+XszBKIWTlAbZpE5QgJ6g==
buyer_id = 2088102169474200
body = Javen IJPay PC支付测试
invoice_amount = 88.88
version = 1.0
notify_id = 43749ffb4d02c02f4bfc5ee4fe5761ehjm
fund_bill_list = [{"amount":"88.88","fundChannel":"ALIPAYACCOUNT"}]
notify_type = trade_status_sync
out_trade_no = 051413260514947
total_amount = 88.88
trade_status = TRADE_SUCCESS
trade_no = 2017051421001004200200241311
auth_app_id = 2016102000727659
receipt_amount = 88.88
point_amount = 0.00
sign_type = RSA2
buyer_pay_amount = 88.88
app_id = 2016102000727659
seller_id = 2088102180432465
notify_url 验证成功succcess
商户页面同步的参数
>>>>total_amount=88.88×tamp=2017-05-14+13%3A28%3A11&sign=KRn%2FEi%2B8lOpPdmSBg8ZsB9dUsV8la2bMWaFGFs5R2hhQOP283m%2BolOwFamfC%2B1thxfIsEi92w99lH24K044yj6aLAN8mJq3umQTRI6j2SvZgn1Ufgpd5KdjfmpEAR5omFOJJP%2FDXIb2zEFs6VvA60RmpwYT5mHbujSWDUvj7X0LX1SGd5l90DbyUDtfMe%2FRSqBFd0iIDLloa78a3dPqHcId3mUKP4RrzZBGWNbAYxrZiEslmZiU%2BnT9K0zL9t%2BVm%2B24pHWsgVOR7hb4UicT%2FfHk6VnDPTnOlfVfJD3vOE2FP6N0jgj0QEKNIynOp6t74zmE8Xkca3pGQnkYyrUEQyg%3D%3D&trade_no=2017051421001004200200241311&sign_type=RSA2&auth_app_id=2016102000727659&charset=UTF-8&seller_id=2088102180432465&method=alipay.trade.page.pay.return&app_id=2016102000727659&out_trade_no=051413260514947&version=1.0
charset = UTF-8
out_trade_no = 051413260514947
method = alipay.trade.page.pay.return
total_amount = 88.88
sign = KRn/Ei+8lOpPdmSBg8ZsB9dUsV8la2bMWaFGFs5R2hhQOP283m+olOwFamfC+1thxfIsEi92w99lH24K044yj6aLAN8mJq3umQTRI6j2SvZgn1Ufgpd5KdjfmpEAR5omFOJJP/DXIb2zEFs6VvA60RmpwYT5mHbujSWDUvj7X0LX1SGd5l90DbyUDtfMe/RSqBFd0iIDLloa78a3dPqHcId3mUKP4RrzZBGWNbAYxrZiEslmZiU+nT9K0zL9t+Vm+24pHWsgVOR7hb4UicT/fHk6VnDPTnOlfVfJD3vOE2FP6N0jgj0QEKNIynOp6t74zmE8Xkca3pGQnkYyrUEQyg==
trade_no = 2017051421001004200200241311
auth_app_id = 2016102000727659
version = 1.0
sign_type = RSA2
app_id = 2016102000727659
seller_id = 2088102180432465
timestamp = 2017-05-14 13:28:11
return_url 验证成功
推荐阅读:
微信、支付宝App支付-JPay0.0.2发布
支付宝支付-提现到个人支付宝
支付宝支付-刷卡支付(条码支付)
支付宝支付-扫码支付一张二维码集成微信、支付宝支付
支付宝Wap支付你了解多少?
Android版-支付宝APP支付
支付宝支付-常用支付API详解(查询、退款、提现等)
支付宝支付-PC电脑网站支付的更多相关文章
- 支付宝支付之扫码支付(电脑网站支付)、H5支付(手机网站支付)相关业务流程分析总结
前言 在上一篇文章<微信支付之扫码支付.公众号支付.H5支付.小程序支付相关业务流程分析总结>中,分析和总结了微信支付相关支付类型的业务流程,这里作为与微信支付平起平坐不相伯仲的支付宝支付 ...
- PHP开发支付宝之电脑网站支付--流程简介
前言 前端时间自己开发了一个drupal的支付宝模块,现在整理一下过程,因为支付宝官方网站提供的接口及文档都是新接口的,而且使用新接口的过程比较麻烦一点,所以整理一下 1.支付宝的账号必须经过企业资格 ...
- 支付宝开发之手机网站支付(H5支付)
其实官方的文档中:https://docs.open.alipay.com/203 介绍的已经很详细了,我就实地的看文档操作了一遍,具体步骤如下: 一.创建应用 流程如下: 首先要有支付宝开放平台: ...
- java支付宝开发-02-手机网站支付
源码已上传github,欢迎专注:https://github.com/shirayner/alipay-wap 一.基础部分 1.手机网站支付产品介绍 1.1 阅读官方介绍: 手机网站支付产品介绍 ...
- 支付宝电脑网站支付 alipay.trade.page.pay
只涉及支付接口 其他接口没有使用 支付宝官方文档:https://docs.open.alipay.com/270/105899/ 支付接口文档 https://docs.open.alipay.co ...
- ASP.NET Core 2.0 使用支付宝PC网站支付
前言 最近在使用ASP.NET Core来进行开发,刚好有个接入支付宝支付的需求,百度了一下没找到相关的资料,看了官方的SDK以及Demo都还是.NET Framework的,所以就先根据官方SDK的 ...
- ASP.NET Core 2.0 使用支付宝PC网站支付实现代码(转)
最近在使用ASP.NET Core来进行开发,刚好有个接入支付宝支付的需求,百度了一下没找到相关的资料,看了官方的SDK以及Demo都还是.NET Framework的,所以就先根据官方SDK的源码, ...
- Asp.Net支付宝手机网站支付接口API之C#版
一.准备工作 1.使用企业支付宝签约手机网站支付 2.下载支付宝官方demo 文档地址:https://doc.open.alipay.com/doc2/detail?treeId=60&ar ...
- Python接入支付宝进行PC端支付
1. 支付宝开放平台登录,使用支付宝账号登录 https://open.alipay.com/platform/home.htm 2.选择沙箱模式 [支付宝提供了测试环境] https://docs ...
随机推荐
- RednaxelaFX:软件工程师、主攻高级编程语言虚拟机的设计与实现
https://www.zhihu.com/people/rednaxelafx/posts
- STL中经常使用数据结构
STL中经常使用的数据结构: [1] stack.queue默认的底层实现为deque结构. [2] deque:用map管理多个size大小的连续内存块,方便头尾插入. [3] vector: ...
- C#复制数组的两种方式,以及效率比较
如何高效地进行数组复制? 如果把一个变量值复制给另外一个数组变量,那么2个变量指向托管堆上同一个引用. 如果想在托管堆上创建另外的一份数组实例,通常使用Array.Copy方法. class Prog ...
- Javascript:原型模式类继承
原型模式 每个函数(准确说不是类.对象)都有一个prototype属性,这个属性是一个指针,指向一个对象. 使用原型对象的好处是可以让所有对象实例共享它包含的属性和方法. 1.原型对象 (1)当创 ...
- Javascript数据模型
本文主要描述Javascript的数据模型,即对Javascript所支持的数据类型的一个全局概缆.文章比较的理论化,非常深入,因此不易理解,但务必对数据模型有一个映象,因为他是理解Javascrip ...
- cocos2d-x系列笔记技巧篇(2)---关于CREATE_FUNC宏的用法
FROM://http://blog.csdn.net/jinciyulang/article/details/8631889 阅读cocos2d-x demo的代码,我们会看到有些头文件中使用CRE ...
- android 读取 raw 中的文件。
file.getParentFile().mkdir(); file.createNewFile(); InputStream inputStream = context.getResources() ...
- WordPress主题开发:WP_Query常用参数
常用参数 用途 调用文章或页面 s 查询和某个关键词相关的所有的文章/页面信息 p 文章或页面id post__in 多篇id post__not_in 多篇id以外 post_type 查询的信息类 ...
- Java实现在线预览Word,Excel,Ppt文档
效果图:
- mysql 查询时间戳(TIMESTAMP)转成常用可读时间格式
from_unixtime()是MySQL里的时间函数 date为需要处理的参数(该参数是Unix 时间戳),可以是字段名,也可以直接是Unix 时间戳字符串 后面的 '%Y%m%d' 主要是将返回值 ...