只涉及支付接口 其他接口没有使用

支付宝官方文档:https://docs.open.alipay.com/270/105899/

支付接口文档 https://docs.open.alipay.com/270/alipay.trade.page.pay/

建议使用沙箱环境进行测试,沙箱接入 https://docs.open.alipay.com/200/105311

具体实现请参考文档和官方demo

注意事项:
请求支付页面
  • 调用sdk的参数封装成静态变量,通过配置文件导入
  • 确认支付宝公钥和商户私钥是否正确, 使用RSA2 签名,回调地址必须外网可以访问到
  • 使用对象封装请求参数
  • goods_detail类型为 com.alipay.api.domain.GoodsDetail
  • JSONObject bizJson = JSONObject.fromObject(bizContent);转为json格式
  • 使用HttpServletResponse 输出页面,避免中文乱码出现
异步回调:
  • 参考文档使用sdk验证签名
  • 注意验证app_id 和 seller_id 等.
package com.youboy.order.controller.callback;

import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody; import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import com.youboy.alipay.constant.AlipayConfig;
import com.youboy.memberService.api.IQualificationService;
import com.youboy.order.api.hxpay.IBankDockingRecordsService;
import com.youboy.order.api.hxpay.IBankHxAccountService;
import com.youboy.order.exception.OrderWebOSException;
import com.youboy.pay.api.IPayService;
import com.youboy.pay.api.IPayWorker;
import com.youboy.pay.dto.PayBill;
import com.youboy.pay.dto.bank.BackCode;
import com.youboy.pay.dto.bank.GnetOrder;
import com.youboy.pay.exception.PayWebOSException;
import com.youboy.pay.utils.PaySta;
import com.youboy.shardSessionFilter.MemCacheManagerSpy; /**
* 支付宝回调
*/
@Controller
@RequestMapping("/zfb/callback")
public class ZfbPayBackOrderController { private final Logger logger = Logger.getLogger(ZfbPayBackOrderController.class); /**
* 支付宝支付异步回调
* @param model
* @param request
* @param response
* @param session
* @throws OrderWebOSException
*/
@RequestMapping(value = "/payCallBack", method = RequestMethod.POST)
@ResponseBody
public String zfbPayCallBack(ModelMap model,
HttpServletRequest request, HttpServletResponse response,
HttpSession session) throws OrderWebOSException {
boolean signVerified = checkRSA(request);
if (!signVerified) { // 验证失败
logger.error("不是支付宝的合法请求!");
return "fail";
}
// 验证通知是否有效
boolean checkedTrustiness = checkedTrustiness(request);
if (!checkedTrustiness) {
logger.error("支付宝请求异常!");
return "fail";
}
if ("TRADE_FINISHED".equals(trade_status) || "TRADE_SUCCESS".equals(trade_status)) {//TRADE_FINISHED交易成功并结束
......
} /*else if (trade_status.equals("TRADE_SUCCESS")) {
// 判断该笔订单是否在商户网站中已经做过处理
// 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
// 如果有做过处理,不执行商户的业务程序 // 注意:
// 付款完成后,支付宝系统发送该交易状态通知
}*/ return "fail"; } /**
* 验证是否为支付宝的合法请求 --验证签名
* @param request 获取到的请求
* @return
*/
private boolean checkRSA(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] + ",";
}
// 乱码解决,这段代码在出现乱码时使用
/*
* try {
* valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
* } catch (UnsupportedEncodingException e) {
* logger.error("回调接收参数乱码",e);
* }
*/
params.put(name, valueStr);
}
logger.info("收到支付宝异步回调:");
logger.info(params.toString());
boolean signVerified = false;
// 调用SDK验证签名
try {
signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset,
AlipayConfig.sign_type);
return signVerified;
} catch (AlipayApiException e) {
// 调试用,写文本函数记录程序运行情况是否正常
String sWord = AlipaySignature.getSignCheckContentV1(params);
AlipayConfig.logResult(sWord);
logger.error("支付宝回调验证签名异常", e);
return signVerified;
} } // 验证支付
private boolean checkedTrustiness(HttpServletRequest request) {
// 验证成功
String out_trade_no = "";
String trade_status = "";
String seller_id = "";
String app_id = "";
BigDecimal total_amount;
try {
// 商户订单号
out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8"); // 支付宝交易号
// trade_no = new
// String(request.getParameter("trade_no").getBytes("ISO-8859-1"),
// "UTF-8"); // 交易状态
trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
// 支付订单金额
total_amount = new BigDecimal(
new String(request.getParameter("buyer_pay_amount").getBytes("ISO-8859-1"), "UTF-8"));
// 卖家支付宝账号
seller_id = new String(request.getParameter("seller_id").getBytes("ISO-8859-1"), "UTF-8");
app_id = new String(request.getParameter("app_id").getBytes("ISO-8859-1"), "UTF-8"); } catch (UnsupportedEncodingException e) {
logger.error("回调参数格式转换异常(payid=" + out_trade_no + ")", e);
return false;
}
if (!"TRADE_FINISHED".equals(trade_status) && !"TRADE_SUCCESS".equals(trade_status)) {
logger.error("支付宝返回的交易状态不正确(payid=" + out_trade_no + ")");
return false;
}
// 2.验证out_trade_no是否正确
PayBill bill = new PayBill();
try {
bill = payService.find(out_trade_no).get(0);
} catch (PayWebOSException e) {
logger.error("paybill 查询订单情况异常 (payid=" + out_trade_no + ")", e);
return false;
}
// 3.判断totalamount
if (!total_amount.equals(bill.getAmount()) ) {
logger.error("支付宝返回的订单金额不正确(payid=" + out_trade_no + ")");
return false;
}
// 支付状态是否正确
if (PaySta.Success.equals(bill.getStatus())) {
logger.error("订单状态不正确(payid=" + out_trade_no + ")");
return false;
}
// 判断 seller_id
if (!AlipayConfig.seller_id.equals(seller_id)) {
logger.error("支付宝返回的seller_id不正确(payid=" + out_trade_no + ")");
return false;
}
// 5.验证app_id
if (!AlipayConfig.app_id.equals(app_id)) {
logger.error("支付宝返回的app_id不正确(payid=" + out_trade_no + ")");
return false;
}
return true; } }

支付宝电脑网站支付 alipay.trade.page.pay的更多相关文章

  1. 支付宝支付-PC电脑网站支付

    支付产品全面升级(更新时间:2017/05/05 ),若您使用的是老接口,请移步老版本即时到账文档. 支持沙盒环境的测试 此项目已开源欢迎Start.PR.发起Issues一起讨论交流共同进步 htt ...

  2. 支付宝支付之扫码支付(电脑网站支付)、H5支付(手机网站支付)相关业务流程分析总结

    前言 在上一篇文章<微信支付之扫码支付.公众号支付.H5支付.小程序支付相关业务流程分析总结>中,分析和总结了微信支付相关支付类型的业务流程,这里作为与微信支付平起平坐不相伯仲的支付宝支付 ...

  3. ASP.NET Core Web 支付功能接入 支付宝-电脑网页支付篇

    这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入支付宝-电脑网页支付接口及同步跳转及异步通知功能. 开发环境:Win 10 x64.VS2017 15.6.4..NET ...

  4. 【转载】ASP.NET Core Web 支付功能接入 支付宝-电脑网页支付篇

    转自:http://www.cnblogs.com/essenroc/p/8627775.html 这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入支付宝-电脑网页支付 ...

  5. PHP开发支付宝之电脑网站支付--流程简介

    前言 前端时间自己开发了一个drupal的支付宝模块,现在整理一下过程,因为支付宝官方网站提供的接口及文档都是新接口的,而且使用新接口的过程比较麻烦一点,所以整理一下 1.支付宝的账号必须经过企业资格 ...

  6. ASP.NET Core 2.0 使用支付宝PC网站支付

    前言 最近在使用ASP.NET Core来进行开发,刚好有个接入支付宝支付的需求,百度了一下没找到相关的资料,看了官方的SDK以及Demo都还是.NET Framework的,所以就先根据官方SDK的 ...

  7. Asp.Net支付宝手机网站支付接口API之C#版

    一.准备工作 1.使用企业支付宝签约手机网站支付 2.下载支付宝官方demo 文档地址:https://doc.open.alipay.com/doc2/detail?treeId=60&ar ...

  8. ASP.NET Core 2.0 使用支付宝PC网站支付实现代码(转)

    最近在使用ASP.NET Core来进行开发,刚好有个接入支付宝支付的需求,百度了一下没找到相关的资料,看了官方的SDK以及Demo都还是.NET Framework的,所以就先根据官方SDK的源码, ...

  9. Laravel5.5 支付宝手机网站支付的教程

    https://segmentfault.com/a/1190000015559571 这篇文章主要介绍了Laravel5.5 支付宝手机网站支付的教程,小编觉得挺不错的,现在分享给大家,也给大家做个 ...

随机推荐

  1. 第七章 HTTP协议原理

    一.HTTP协议概述 1.什么是HTTP? HTTP 全称:Hyper Text Transfer Protocol 中文名:超文本传输协议 http就是将用户的请求发送到服务器,将服务器请求到的内容 ...

  2. 第一章 Linux操作系统及其历史介绍

    一.什么是操作系统 1.基本含义: 简称OS 是计算机系统中必不可少的基础系统软件,是应用程序运行和用户操作必备的基础环境 操作系统就是一个人与计算机之间的中介 2.组成方式: 操作系统的组成: 计算 ...

  3. ServletContext使用介绍

    ServletContext是一个容器(域对象)可以存储键值对数据(String key,Object value),保存在ServletContext中的数据不仅可以提供给所有的servlet使用, ...

  4. Hadoop1.0 和 Hadoop2.0

    date: 2018-11-16 18:54:37 updated: 2018-11-16 18:54:37 1.从Hadoop整体框架来说 1.1 Hadoop1.0即第一代Hadoop,由分布式存 ...

  5. Redis---03Redis事务

    一.Redis事务 1.简述: Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断 2.作用: 主要作用就是串联多 ...

  6. vue学习笔记(六) ----- vue组件

    一.模块化与组件化 模块化的定义 模块化在Node中是一个规范,定义一些模块的相关的规则,从代码角度上来说,方便做区别,如果不使用模块化,写在js文件中不利于后期维护和扩展,从代码的层面上就把相关的功 ...

  7. 专攻知识小点——回顾JavaWeb中的servlet(三)

    HttpSession基本概述 ** ** 1.HttpSession:是服务器端的技术.和Cookie一样也是服务器和客户端的会话.获得该对象是通过HTTPServletRequest的方法getS ...

  8. Kubernetes 搭建 ES 集群(存储使用 cephfs)

    一.集群规划 使用 cephfs 实现分布式存储和数据持久化 ES 集群的 master 节点至少需要三个,防止脑裂. 由于 master 在配置过程中需要保证主机名固定和唯一,所以搭建 master ...

  9. 怎么提高selenium脚本的自动化执行效率?

    1.使用配置更高的电脑,选择更快的网络环境:2.使用效率更高的语言,比如 java 比 python,这种方案可行性不高:3.能直接访问网址的,就不要一步一步点击:4.不要盲目增加 sleep,尽量使 ...

  10. .NET CORE 下如何使用国产数据库进行 开发

    主流国产数据库 随着贸易战的升级 ,自主研发和知识产权也是一个大的趋势,达梦和人大金仓是国产数据库中比较主流的 1.达梦数据库 更接近Oracle,更偏向自主研发,对开发人员友好度不如金仓 达梦公司在 ...