最近一直在接触第三方,刚接入完支付宝的API做一下总结,个人能力薄弱有不对的地方望指教.  做的是一个小型电商项目,所以会接入第三方的支付和登入功能, 第一次接入第三方撸了很多官方文档.

  进入主题, 支付宝支付先要去 蚂蚁金服开放平台注册账号:https://open.alipay.com/platform/home.htm

  然后创建应用选择需要接入的功能,有些应用是需要签约的签约就好了审核蛮快的.

  

  以上应用申请,功能申请的一些操作我就不多做解释了网上很多例子,

   Java支付宝支付

  这里有APP支付和手机网站支付, APP支付是针对Android和IOS的案例,  那么我做的是手机网站支付针对Java后台的案例.

  这里直达官方文档:https://docs.open.alipay.com/203/105285/

   我直接贴我的代码:

 /**
*
* 说明:支付宝支付 (我只填了部分参数,如果有更多参数需求的 可以直接:https://docs.open.alipay.com/203/107090/ )
* @param orderNumber 商户网站唯一订单号
* @param orderMoney 订单金额
* @param orderSubject 商品的标题,关键字
* @param notifyUrl 异步回调地址(后台) 获取订单信息
* @param returnUrl 同步回调地址(APP) 处理业务及渲染页面
* @author ArLen
* @time:2018年12月11日 下午2:14:57
*/
@Override
public void payment(String orderNumber,
String orderMoney,
String orderSubject,
String notifyUrl,
String returnUrl) { //填写自己创建的app的对应参数
private static AlipayClient alipayClient = new DefaultAlipayClient("支付宝网关", "appid", "私钥", "json", "utf-8", "公钥","RSA2"); AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
// 封装请求支付信息
AlipayTradeWapPayModel model=new AlipayTradeWapPayModel();
model.setOutTradeNo(orderNumber);
model.setTotalAmount(orderMoney);
model.setSubject(orderSubject);
model.setProductCode("QUICK_WAP_WAY");
alipayRequest.setBizModel(model);
//异步回调地址(后台)
alipayRequest.setNotifyUrl(notifyUrl);
// 同步回调地址(APP)
alipayRequest.setReturnUrl(returnUrl); try {
//调用SDK生成表单
String form = alipayClient.pageExecute(alipayRequest).getBody(); //打印, 可以直接response到页面上
System.out.println(form);
} catch (AlipayApiException e) {
e.printStackTrace();
} }

   支付成功后支付宝会自动请求你写的  notifyUrl (异步通知, 接收支付宝异步通知,从而获取此订单的状态) 和 returnUrl  (支付完成后,支付宝会发送同步请求进行数据渲染,  这里我是用ModelAndView 渲染的数据)

  notifyUrl异步通知代码    

  异步响应数据官方文档: https://docs.open.alipay.com/203/105286/

公共响应参数 :https://docs.open.alipay.com/api_1/alipay.trade.wap.pay

  

	/**
*
* 说明:对于手机网站支付产生的交易,支付宝会根据原始支付API中传入的异步通知地址notify_url,通过POST请求的形式将支付结果作为参数通知到商户系统。
* @param request
* @return
* @author Arlen
* @time:2018年12月3日 下午4:51:35
*/
@RequestMapping("notifyUrl")
@ResponseBody
public String notify(HttpServletRequest request){
int im=0;
im++;
//测试请求次数
System.out.println("次数:"+im);
//获取支付宝POST过来反馈信息
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] + ",";
}
//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
params.put(name, valueStr);
} //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
//商户订单号
String out_trade_no = request.getParameter("out_trade_no"); //支付宝交易号
String trade_no = request.getParameter("trade_no"); //交易状态
String trade_status = request.getParameter("trade_status");
System.out.println(trade_status); try {
boolean verify_result = AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, "utf-8", "RSA2"); if(verify_result){
//验证成功
//请在这里加上商户的业务逻辑程序代码
System.out.println("returnUrl_params:验证成功");
//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
boolean flg = false;
if(trade_status.equals("TRADE_FINISHED")){
System.out.println("returnUrl_params:交易结束");
//交易结束,不可退款 //注意:
//退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
} else if (trade_status.equals("TRADE_SUCCESS")){
//交易支付成功 //注意:
//付款完成后,支付宝系统发送该交易状态通知 //根据订单号将订单状态和支付宝记录表中状态都改为已支付
System.out.println("returnUrl_params:交易支付成功");
flg = true;
} //——请根据您的业务逻辑来编写程序(以上代码仅作参考)—— if(flg){
return "success";
}else{
return "fail";
} }else{//验证失败
//out.print("fail");
return "fail";
}
} catch (AlipayApiException e) {
e.printStackTrace();
return "500";
} }

  returnUrl 同步通知代码

   我在这边处理了业务逻辑,还在测试阶段, 我觉得有些欠缺.

@RequestMapping("/returnUrl")
public ModelAndView result( HttpServletRequest request) {
System.out.println("进来");
//用ModelAndView 进行数据渲染
ModelAndView mv = new ModelAndView("alipay/return_url");
//获取支付宝GET过来反馈信息
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] + ",";
} //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
//交易订单编号
String out_trade_no = request.getParameter("out_trade_no");
//交易金额
String total_amount = request.getParameter("total_amount");
//支付宝交易账号
//String trade_no = request.getParameter("trade_no");
//订单创建时间
String timestamp = request.getParameter("timestamp"); mv.addObject("out_trade_no", out_trade_no);
mv.addObject("total_amount", total_amount);
mv.addObject("timestamp", timestamp); //打印所有响应数据
System.out.println("returnUrl_params:"+params);
try {
boolean verify_result = AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, "utf-8", "RSA2"); if(verify_result){
//验证成功 这里写的是假代码
//系统处理根据支付宝回调更改订单状态或者其他关联表的数据 (走业务流程, 根据订单编号获取订单数据
//Order order =orderService.queryOrderByNumber(out_trade_no); /* if(order !=null){
    //order不为null mv.addObject("verify_result", verify_result);
mv.addObject("msg", "商户订单号不存在"); } */ return mv;
}else{
//验证失败 跳失败页面
System.out.println("验证失败");
return null;
}
} catch (AlipayApiException e) {
e.printStackTrace();
//出现异常 跳失败页面
return null;
} }

   今天就先写到 支付宝支付,明天再写支付宝退款及其他操作.

  

Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)的更多相关文章

  1. Java 支付宝支付,退款,单笔转账到支付宝账户(单笔转账到支付宝账户)

    上次分享了支付宝订单退款的代码,今天分享一下支付宝转账的操作.  现在是有一个余额提现的功能,本来是打算做提现到银行卡的,但是客户嫌麻烦不想注册银联的开放平台账户,就说先提现到支付宝就行,二期再做银行 ...

  2. Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝订单退款)

    上一篇写到支付宝的支付,这代码copy下来就能直接用了,   我写学习文档时会经常贴 官方参数文档的案例地址, 因为我觉得 请求参数,响应参数说明 官方文档整理的很好,毕竟官方不会误导大家. 我学一个 ...

  3. 如何使用沙箱测试单笔转账到支付宝账号(php版) https://openclub.alipay.com/read.php?tid=1770&fid=28

    说明:   本帖是利用支付宝沙箱测试电脑网站支付接口   测试环境:Apache2.4.23 +php 5.6.25   沙箱环境测试正式环境请修改网关为下方值   复制代码 1 正式环境网关:htt ...

  4. Laravel 开发支付宝支付与提现转账问题小结

    由于项目需要,所以需要开发支付宝支付与微信支付,支付部分采用了 yansongda/pay    https://packagist.org/packages/yansongda/pay  https ...

  5. Python支付宝单笔转账接口

    开发信息 接口加签方式为证书模式 证书模式好处是可以使用支付宝的转账到支付宝账户,也就是提现功能,公钥模式不能实现转账到支付宝账户. 此DEMO利用单笔转账到支付宝账户接口[提现功能]用户可以通过此D ...

  6. asp.net mvc 接入最新支付宝支付+退款 alipay-sdk-NET-20170615110549

    第1步: https://openhome.alipay.com/developmentDocument.htm 第2步:下载sdk和demo https://docs.open.alipay.com ...

  7. Java springboot支付宝小程序授权,获取用户信息,支付及回调

    参考官方文档https://opendocs.alipay.com/mini/introduce/pay 支付宝小程序的支付和微信小程序的支付一样第一步都是要获取到用户的唯一标识,在微信中我们获取到的 ...

  8. 基于xposed逆向微信、支付宝、云闪付来实现个人免签支付功能

    我的个人网站如何实现支付功能? 想必很多程序员都有过想开发一个自己的网站来获得一些额外的收入,但做这件事会遇到支付这个问题.目前个人网站通过常规手法是无法实现支付管理的,所有支付渠道都需要以公司的身份 ...

  9. asp 支付宝 企业版 接口 支持网银接口 ,网银直接支付

    asp 支付宝 企业版 接口 支持网银接口 ,网银直接支付 仅仅是多了一个defalutbank的參数. 详细看 open.alipay.com <% ' 类名:AlipaySubmit ' 功 ...

随机推荐

  1. 源码分析MySQL mysql_real_query函数

    目录 目录 1 1. 前言 1 2. 调用路径 2 3. MAX_PACKET_LENGTH宏 2 4. DBUG_RETURN宏 3 5. COM_QUERY枚举值 3 6. mysql_query ...

  2. Do More With These Great Plugins for Windows Live Writer(old)

    This article is out of day,now we use open live wirter, but we don’t have so much works great plugin ...

  3. less的功能和介绍

    在全新的css中,经过程序员们的开发和努力.又打造了全新的less样式表的全新界面,只需引入外部样式表即刻套用,加上了函数定义和取值.大大的降低了代码的书写量.也更加方便程序员的调用和修改!

  4. ajax跨域问题小结

    跨域:跨域名的访问,是浏览器对ajax的一种限制,这样可以有效的房子跨站攻击 跨域的范畴: 域名不同  或 端口不同 或 二级域名不同 解决方案: 第一种:由于前端基础薄弱,且该方式老掉牙,不讲解: ...

  5. 移动端IM开发者必读(二):史上最全移动弱网络优化方法总结

    1.前言 本文接上篇<移动端IM开发者必读(一):通俗易懂,理解移动网络的“弱”和“慢”>,关于移动网络的主要特性,在上篇中已进行过详细地阐述,本文将针对上篇中提到的特性,结合我们的实践经 ...

  6. 【Spark调优】Shuffle原理理解与参数调优

    [生产实践经验] 生产实践中的切身体会是:影响Spark性能的大BOSS就是shuffle,抓住并解决shuffle这个主要原因,事半功倍. [Shuffle原理学习笔记] 1.未经优化的HashSh ...

  7. 关于Ubuntu拒绝root用户ssh远程登录

    #sudo vim /etc/ssh/sshd_config 找到并用#注释掉这行:PermitRootLogin prohibit-password 新建一行 添加:PermitRootLogin ...

  8. request和response简介

    Tomcat收到客户端的http请求,会针对每一次请求,分别创建一个代表请求的request对象.和代表响应的response对象. 既然request对象代表http请求,那么我们获取浏览器提交过来 ...

  9. 【Redis面试题】Redis的字符串是怎么实现的?

    年前本人在找工作面试时在Redis相关问题上可栽了跟头.在面试前按常规套路准备了一下,比如 Redis 的常用5种数据结构,Redis持久化策略,Redis实现分布式锁,简单发布订阅等等都准备了,当时 ...

  10. 【LeetCode】7. 整数反转python3

    题目 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1:输入: 123 输出: 321  示例 2:输入: -123 输出: -321 示例 3:输入: 120 输出 ...