s

前言

在开发的过程中,不可避免的都需要使用支付功能,本文档主要给大家分享,自己的一次支付宝开发时的经历.支付宝开发,对于个人开发者而言相对于其他支付来说相对比较友好,因为有沙箱环境支持我们在开发阶段测试使用,话不多说,接下来就介绍开发过程

注册成为开发者

  • 官网地址: https://open.alipay.com/platform/home.htm
  • 使用支付宝登录即可
  • 找到沙箱环境

配置沙箱环境

  • 官方参考文档:https://opendocs.alipay.com/open/200/105311

  • 沙箱环境配置首页:https://openhome.alipay.com/platform/appDaily.htm 需要登陆后方可进入

  • 具体配置步骤:

    • 设置秘钥

      • (参考链接:https://opendocs.alipay.com/open/291/105971)根据文档生成秘钥对
      • 将生成的秘钥中的公钥设置到下方的参数中

- 这时我们也能看到支付宝的公钥,回头我们要在配置文件中使用
  • 获取 APPID

  • 下载沙箱app环境

  • 登录账号:支付宝为我们提供了商家账号和卖家账号,也可以设置账户余额(突然感觉自己变有钱了)

到此时我们的沙箱以及沙箱App环境已经准备好了,接下来我们将要编写java后台代码

支付代码

准备工作
  • 创建springboot项目

  • 引入依赖

     <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--  支付宝依赖 https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java --><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.10.140.ALL</version></dependency><!--常用工具类 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency>
    
  • 设定服务端口:我设置的为8089,大家可以随意设定,也可以不进行配置,默认80

  • 创建配置类AliPayConfig,配置属性参数

    /*** AliPayConfig** @author cmm* @date 2020/10/29 9:48*/
    public class AliPayConfig {//部分参数这里并没有设定,具体开发时大家可以根据需求自己设定/*  //当面付最大查询次数和查询间隔(毫秒)max_query_retry = 5query_duration = 5000//当面付最大撤销次数和撤销间隔(毫秒)max_cancel_retry = 3cancel_duration = 2000//交易保障线程第一次调度延迟和调度间隔(秒)heartbeat_delay = 5heartbeat_duration = 900*//*** 支付宝网关名*///private static String openApiDomain = "https://openapi.alipay.com/gateway.do"; 正式环境public static String openApiDomain = "https://openapi.alipaydev.com/gateway.do"; //开发环境/*** appid 沙箱环境处可以找到我们的APPID*/public static String appId = "自己的APPID";/*** 应用私钥*/public static String privateKey = "自己配置沙箱环境秘钥时生成的密钥对中的私钥";/*** 应用公钥*/public static String publicKey ="自己配置沙箱环境秘钥时生成的密钥对中的公钥";/*** 支付宝公钥*/public static String alipayPublicKey = "配置沙箱秘钥时显示的支付宝公钥";/*** 签名类型*/public static String signType = "RSA2";}
网页支付代码

package com.cmm.alipay.controller;import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.*;
import com.alipay.api.response.*;
import com.cmm.alipay.config.AliPayConfig;
import com.cmm.alipay.config.DateUtils;
import com.cmm.alipay.config.HttpsUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;/*** AliPayController** @author cmm* @date 2020/10/29 10:01*/
@RestController
@RequestMapping("/alipay")
public class AliPayController {/**创建请求客户端*/private static AlipayClient alipayClient;static {//静态初始化请求客户端,补充加载配置文件中的参数alipayClient = new DefaultAlipayClient(AliPayConfig.openApiDomain,AliPayConfig.appId,AliPayConfig.privateKey,"JSON","UTF-8",AliPayConfig.alipayPublicKey,AliPayConfig.signType);}/*** 网页支付创建并下单接口* 参考API文档链接:https://opendocs.alipay.com/apis/api_1/alipay.trade.page.pay* 本接口商品信息没有填写,具体参数参考api接口根据需求自由补充即可* @param response* @throws AlipayApiException* @throws IOException*/@RequestMapping("/pay")public void aliPay(HttpServletResponse response) throws AlipayApiException, IOException {//网页支付页面所需要的请求类AlipayTradePagePayRequest alipayTradePagePayRequest = new AlipayTradePagePayRequest();//创建请求参数Map<String, Object> mapParams = new HashMap<>();//设置异步回调地址(此地址一般为支付成功后调用该地址处理服务逻辑)alipayTradePagePayRequest.setNotifyUrl("http://alipay.free.idcfengye.com/alipay/notify");//自己服务的接口地址,要求外网可以访问//设置同步回调地址,这里我跳转了页面alipayTradePagePayRequest.setReturnUrl("http://alipay.free.idcfengye.com/paySuccess.html");//自己服务的接口地址,要求外网可以访问//设置订单编号(商家端,即后台要保证订单编号唯一)mapParams.put("out_trade_no",System.currentTimeMillis());//销售产品码mapParams.put("product_code","FAST_INSTANT_TRADE_PAY");//设置商品标题mapParams.put("subject","Iphone111");//设置商品金额(必须保证小数点后两位,例如88应为88.00)mapParams.put("total_amount",18+".88");//设置跳转模式/*** 跳转模式。* 前置模式是将二维码前置到商户* 的订单确认页的模式。需要商户在* 自己的页面中以 iframe 方式请求* 支付宝页面。具体分为以下几种:* 0:订单码-简约前置模式,对应 iframe 宽度不能小于600px,高度不能小于300px;* 1:订单码-前置模式,对应iframe 宽度不能小于 300px,高度不能小于600px;* 3:订单码-迷你前置模式,对应 iframe 宽度不能小于 75px,高度不能小于75px;* 4:订单码-可定义宽度的嵌入式二维码,商户可根据需要设定二维码的大小。** 跳转模式下,用户的扫码界面是由支付宝生成的,不在商户的域名下。* 2:订单码-跳转模式*/mapParams.put("qr_pay_mode","4");//设置超时时间String dateStr = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", DateUtils.addMinutes(DateUtils.getNowDate(), 3));mapParams.put("time_expire",dateStr);//额外参数,等其他参数参考该接口的api文档根据需求设计即可//将参数转为json串String s = JSONObject.toJSONString(mapParams);//设置请求参数alipayTradePagePayRequest.setBizContent(s);//发送请求获取页面信息AlipayTradePagePayResponse alipayTradePagePayResponse = alipayClient.pageExecute(alipayTradePagePayRequest);//获取body中的信息String body = alipayTradePagePayResponse.getBody();System.out.println(body);//以页面的形式响应信息response.setContentType("text/html;charset=utf-8");response.getWriter().write(body);response.getWriter().flush();response.getWriter().close();}@RequestMapping("/notify")public String notify(HttpServletRequest request)  {Map<String, String> paramsMap = convertRequestParamsToMap(request);System.out.println("支付完成进入异步通知");String out_trade_no= paramsMap.get("out_trade_no");String trade_status= paramsMap.get("trade_status");try {boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, AliPayConfig.alipayPublicKey, "UTF-8", AliPayConfig.signType);//无论同步异步都要验证签名if(signVerified){if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){//处理自己系统的业务逻辑,如:将支付记录状态改为成功,需要返回一个字符串success告知支付宝服务器return "异步 success";} else {//支付失败不处理业务逻辑return "failure";}}else {//签名验证失败不处理业务逻辑return "failure";}} catch (AlipayApiException e) {e.printStackTrace();return "failure";}}// 将request中的参数转换成Mapprivate static Map<String, String> convertRequestParamsToMap(HttpServletRequest request) {Map<String, String> retMap = new HashMap<>();Set<Map.Entry<String, String[]>> entrySet = request.getParameterMap().entrySet();for (Map.Entry<String, String[]> entry : entrySet) {String name = entry.getKey();String[] values = entry.getValue();int valLen = values.length;if (valLen == 1) {retMap.put(name, values[0]);} else if (valLen > 1) {StringBuilder sb = new StringBuilder();for (String val : values) {sb.append(",").append(val);}retMap.put(name, sb.toString().substring(1));} else {retMap.put(name, "");}}return retMap;}@RequestMapping("/query")public void query(HttpServletResponse response) throws AlipayApiException, IOException {AlipayTradeQueryRequest alipayTradeQueryRequest = new AlipayTradeQueryRequest();Map<String, Object> mapParams = new HashMap<>();//设置订单编号mapParams.put("trade_no","2020102922001475080500830170");String s = JSONObject.toJSONString(mapParams);alipayTradeQueryRequest.setBizContent(s);AlipayTradeQueryResponse alipayTradeQueryResponse = alipayClient.pageExecute(alipayTradeQueryRequest);String body = alipayTradeQueryResponse.getBody();System.out.println(body);response.setContentType("text/html;charset=utf-8");response.getWriter().write(body);response.getWriter().flush();response.getWriter().close();//2088102180871897//}/*** 退款接口* @param response* @throws AlipayApiException* @throws IOException*/@RequestMapping("/refund")public void refund(HttpServletResponse response) throws Exception {AlipayTradeRefundRequest alipayTradeRefundRequest = new AlipayTradeRefundRequest();Map<String, Object> mapParams = new HashMap<>();//设置订单编号mapParams.put("trade_no","2020102922001475080500830170");mapParams.put("out_request_no","ABCDEF");mapParams.put("refund_amount","20.00");mapParams.put("refund_reason","正常退款");String s = JSONObject.toJSONString(mapParams);alipayTradeRefundRequest.setBizContent(s);AlipayTradeRefundResponse alipayTradeRefundResponse = alipayClient.pageExecute(alipayTradeRefundRequest, "GET");boolean success = alipayTradeRefundResponse.isSuccess();if(success){String body = alipayTradeRefundResponse.getBody();System.out.println(body);String s1 = HttpsUtils.get(body, null, null);System.out.println(s1);}/**///2088102180871897//}}
app支付
  • 下载app支付测试工具:https://openclub.alipay.com/club/history/read/7695

  • 参考api地址:https://opendocs.alipay.com/apis/api_1/alipay.trade.app.pay

-

  • 服务端代码

    package com.cmm.alipay.controller;import com.alibaba.fastjson.JSONObject;
    import com.alipay.api.AlipayApiException;
    import com.alipay.api.AlipayClient;
    import com.alipay.api.DefaultAlipayClient;
    import com.alipay.api.domain.AlipayTradeAppPayModel;
    import com.alipay.api.domain.AlipayTradePayModel;
    import com.alipay.api.internal.util.AlipaySignature;
    import com.alipay.api.request.*;
    import com.alipay.api.response.*;
    import com.cmm.alipay.config.AliPayConfig;
    import com.cmm.alipay.config.DateUtils;
    import com.cmm.alipay.config.HttpsUtils;
    import com.google.zxing.BarcodeFormat;
    import com.google.zxing.EncodeHintType;
    import com.google.zxing.MultiFormatWriter;
    import com.google.zxing.client.j2se.MatrixToImageWriter;
    import com.google.zxing.common.BitMatrix;
    import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.File;
    import java.io.IOException;
    import java.nio.file.Path;
    import java.text.SimpleDateFormat;
    import java.util.*;/*** AliPayController** @author cmm* @date 2020/10/29 10:01*/
    @RestController
    @RequestMapping("/aliapp")
    public class AliPayAppController {private static AlipayClient alipayClient;static {alipayClient = new DefaultAlipayClient(AliPayConfig.openApiDomain,AliPayConfig.appId,AliPayConfig.privateKey,"JSON","UTF-8",AliPayConfig.alipayPublicKey,AliPayConfig.signType);}@RequestMapping("/pay")public String aliPay(HttpServletResponse response) throws AlipayApiException, IOException {AlipayTradeAppPayRequest alipayTradeAppPayRequest = new AlipayTradeAppPayRequest();Map<String, Object> mapParams = new HashMap<>();alipayTradeAppPayRequest.setNotifyUrl("http://alipay.free.idcfengye.com/aliapp/notify");alipayTradeAppPayRequest.setReturnUrl("http://alipay.free.idcfengye.com/paySuccess.html");//设置订单编号mapParams.put("out_trade_no",System.currentTimeMillis());mapParams.put("timeout_express","30m");//设置支付类型mapParams.put("subject","app商品");mapParams.put("total_amount",18+".88");//设置超时时间String dateStr = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", DateUtils.addMinutes(DateUtils.getNowDate(), 3));mapParams.put("time_expire",dateStr);String s = JSONObject.toJSONString(mapParams);alipayTradeAppPayRequest.setBizContent(s);AlipayTradeAppPayResponse alipayTradeAppPayResponse = alipayClient.sdkExecute(alipayTradeAppPayRequest);String body = alipayTradeAppPayResponse.getBody();System.out.println(body);return body;}
    }
    
  • 调用接口响应如下:

    alipay_sdk=alipay-sdk-java-dynamicVersionNo&app_id=2016102400750511&biz_content=%7B%22time_expire%22%3A%222020-11-04+23%3A04%3A19%22%2C%22out_trade_no%22%3A1604502079233%2C%22total_amount%22%3A%2218.88%22%2C%22subject%22%3A%22app%E5%95%86%E5%93%81%22%2C%22timeout_express%22%3A%2230m%22%7D&charset=UTF-8&format=JSON&method=alipay.trade.app.pay¬ify_url=http%3A%2F%2Falipay.free.idcfengye.com%2Faliapp%2Fnotify&return_url=http%3A%2F%2Falipay.free.idcfengye.com%2FpaySuccess.html&sign=khruIxseoHq0XT72mcASv16Mp80BaIL5npE%2FkPAjueZN16FKT8Xzw4cTRfMezGtX2zsGKNI1dcGNdkbxfPbyC0WNu55J0JYhRrAtXAuy9OCcFYFzQF1QJNoYCfm7AnowfxiDDDfb4lwfpI3NCJIoCMce%2BwG3SAVnw5956Dm7cvakcfyDwo3WdGU9KhD1QZIm1JOTtdNQ25cuGsnhPPuf7xRs%2FTHxbLpXEwv1jlF0r0KgrCmXn8Q9rC8gCvmsykjjX0qQ%2F4YfmobChAC7zwi0UUMN9ClBZ11oBCu4MLpkxef8qxskncbfNT0DUnypGVi5cu2PSvdATIPxlf0Bt%2BnonA%3D%3D&sign_type=RSA2×tamp=2020-11-04+23%3A01%3A19&version=1.0
    
  • 见上面响应的字符串拷贝到测试客户端中


至此,简单的支付宝支付功能已经完成,关于退款,查询及异步通知等功能,大家可以参考官方[api文档]: https://opendocs.alipay.com/apis/api_1如有其它问题也可留言询问!

java服务端开发支付宝支付接口,网页支付与app支付相关推荐

  1. 微信支付java服务端开发(APP)

    我这边是针对微信商户支付功能开发.其他的未涉及到. 当你所有的准备工作准备好后:微信支付申请成功,api_key 配置好,等等一系列. 那么让我们进入java开发吧. 微信支付demo下载: http ...

  2. java服务端开发 php_PHP使用thrift做服务端开发

    php中文网最新课程 每日17点准时技术干货分享 php使用thrift做服务端开发 thrift采用接口描述语言定义和创建服务,用二进制格式传输数据,体积更小.效率更高,对于高并发.数据量大和多语言 ...

  3. 支付相关(二):APP支付宝支付-转账到支付宝账号(JAVA服务端开发)

    首先确保签约单笔转账到支付宝账号 转账到支付宝账号是APP这边一个提现的功能.支付宝提供了可以转账到支付宝账号的功能,可选择收款方账户类型.可取值: 1.ALIPAY_USERID:支付宝账号对应的支 ...

  4. Java服务端集成支付宝支付SDK

    文章目录 文档 流程说明 添加依赖 集成步骤 常见问题 文档 蚂蚁金服官方文档 https://docs.open.alipay.com/54/103419/https://docs.open.ali ...

  5. 应用宝-ysdk-米大师 对接道具直购服务器端下单模式 java服务端开发日志

    用于接收回调请求的linux服务器证书配置: 回调服务器配置分三种,前两种是当服务部署在腾讯云上时的配置方式,第三种为服务部署在自己服务器上是的配置方式: hosting应用on CVM(即应用部署在 ...

  6. java服务端开发的好处_用java开发web的优势到底在哪里?

    你所说的 "客户端访问页面也不需要装jvm啊" 证明了你连服务端和客户端都分不清 你可能是正版培训班的受害者 花点功夫解释下给你哈. 纵向比较:客户端编程 vs 服务器编程 客户使 ...

  7. java服务端开发安全_后端开发:APP与后端交互的安全性

    声明 此文原创,未经允许,禁止转载,可以分享. 最近在做一个项目,是一个APP的后端开发.我需要完成后端框架的建立.数据库设计.后端代码的编写.在这里讲一下APP与后端交互的安全性. 没有AUTH的验 ...

  8. APP登录功能的Java服务端开发

    token 在手机端 没有 Session 这样的概念 一般都是通过token , 来传递验证信息 APP的登录功能的实现方式 对于 账号,密码 两种方式, 一 : 存在手机端 , 二 : 通过 服务 ...

  9. 连引用都答不上,凭什么说你是Java服务端开发

    经常会有朋友找我吹水,最近就说到了一个面试题 谈谈对Java中几种引用的理解. 因此打算以该面试题为例子,写篇文章说说在Java中引用是什么以及怎么用. [划重点:给你三秒钟时间思考,如果是你,该如何 ...

最新文章

  1. 在客户端(IE中)无法登录Citrix MetaFrame server的原因
  2. 访问远程数据库,把远程数据库当做本地库来用
  3. 使用puppeteer爬 EXTJS
  4. 如何将ClearCase集成进VS.NET 2003的IDE
  5. LINUX中软件包的分类
  6. 列的数目比列的名字要多_你们要的甘特图来啦!还有具体做法哦!
  7. 【Flink】The Kryo Output still contains data from a previous serialize call. It has to be flushed or
  8. KingDZ 变菜鸟,每日一个C#小实例之---玩转鼠标
  9. Javascript如何深拷贝对象
  10. linux mysql libc.so_Linux libc依赖包问题如何解决?
  11. PHP搭建留言板,用PHP制作留言板_php
  12. 906. 超级回文数
  13. serverlet增删改查项目代码
  14. Elasticsearch索引分片的数量及大小分配策略
  15. 【Python】Pymyql模块的execute()总结
  16. 给程序员的 2018 新年计划清单
  17. k8s paas部署
  18. ICCV 2021 | OPPO提出室内环境自监督深度估计算法,比肩“有监督”,泛化性能更佳!...
  19. photoshop颈纹去除
  20. tplink错误代码51215_求教tplink wr886n v5.0 ttl 接线方法

热门文章

  1. 查询数据库中存在的回车换行符
  2. 计算机考研哪些学校改科目了,大量考研院校初试科目大改,有你的学校么?
  3. led护眼灯有蓝光吗?双十二选led护眼灯的好处有哪些
  4. FQDN and NetBios
  5. 由View的onAttachedToWindow引发的图片轮播问题探究
  6. 互联网日报 | 微信上线寄收快递服务;跟谁学推出“百家素养课”;宁德时代将发布百万公里续航电池...
  7. 【STM32】HAL库-DMA
  8. 亚马逊云科技 CTO对过去十年的经验总结 – 十条军规
  9. xunsearch mysql_XunSearch的详细用法
  10. 企业上云指南(二):详解篇,云计算是什么?