最近一直在接触第三方,刚接入完支付宝的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. Django积木块二——邮箱

    邮箱 django中自带的功能,因为登录注册都需要邮箱,因此新增了一个小的app--utils用来存放 # email_send.py import random from django.core.m ...

  2. KeepAlived+Nginx 安装

    yum install -y gcc gcc-c++ openssl openssl-devel 目前keepalived最新版本下载:[root@rhel ~]#wget -c http://www ...

  3. 背水一战 Windows 10 (70) - 控件(控件基类): UIElement - Transform3D(3D变换), Projection(3D投影)

    [源码下载] 背水一战 Windows 10 (70) - 控件(控件基类): UIElement - Transform3D(3D变换), Projection(3D投影) 作者:webabcd 介 ...

  4. vs2015 打开项目自动运行 npm install

    问题:VS2015(visual studio 2015) 打开项目自动运行  npm install 解决办法: 打开工具-选项-项目与解决方案--外部web工具   去掉npm勾选 还有如果文件g ...

  5. Android开发 - Retrofit 2 使用自签名的HTTPS证书进行API请求

    为了确保数据传输的安全,现在越来越多的应用使用Https的方式来进行数据传输,使用https有很多有点,比如: HTTPS协议是由SSL+HTTP协议构建的可进行加密传输.身份认证的网络协议,要比ht ...

  6. Alpha冲刺(5/10)——2019.4.28

    所属课程 软件工程1916|W(福州大学) 作业要求 Alpha冲刺(5/10)--2019.4.28 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪 ...

  7. Flask实例化的参数 及 对app的配置

    首先展示一下: from flask import Flask app = Flask(__name__) # type:Flask app.config["DEBUG"] = T ...

  8. go语言异常处理

    go语言异常处理 error接口 go语言引入了一个关于错误错里的标准模式,即error接口,该接口的定义如下: type error interface{ Error() string } 对于要返 ...

  9. 腾讯云播放器更新——TCplayer

    概述 最近腾讯云播放器进行了更新,增加了TCplayer,支持点播播放.由于工作需要,了解了一下TCplayer,把心得记录下来,供以后开发时参考,相信对其他人也有用. 参考文档: TCPlayer开 ...

  10. Testing - 软件测试知识梳理 - 软件性能测试

    软件性能测试的基本概念 软件的性能是软件的一种非功能特性,它关注的不是软件是否能够完成特定的功能,而是软件在完成该功能时展示出来的及时性. 软件性能的指标 响应时间:是指系统对请求作出响应的时间,并且 ...