沙箱环境申请地址:https://open.alipay.com/platform/appDaily.htm?tab=info
所需参数:

//支付宝网关地址:https://openapi.alipay.com/gateway.do
//支付宝申请的APPID
//商户应用私钥(与支付宝数据交互时,保证数据安全,防止数据被篡改)
//支付宝公钥(与支付宝数据交互时,保证数据安全,防止数据被篡改)
//签名算法类型(RSA2或者RSA,支付宝推荐使用RSA2)
//编码格式(utf-8,gb2312,gbk) 

各接口详细参数地址:https://opendocs.alipay.com/apis
沙箱app下载地址(注意沙箱APP只有安卓版本的):https://open.alipay.com/platform/appDaily.htm?tab=tool

maven包地址:

  <dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.22.57.ALL</version></dependency>

SDK所需初始化参数类

app:pay:ali:app_id: 你的appIdmch_id: 你的沙箱商户idserver_url: https://openapi.alipaydev.com/gateway.do #这里是沙箱版本的地址alipay_private_key: 你的应用私钥alipay_public_key: 你的支付宝公钥charset: UTF-8sign_type: RSA2format: jsonnotify_url: http://localhost:8080/api/pay/ali/notifyreturn_url: http://localhost:8080/apirefund_url: http://localhost:8080/api
/*** @author zhangyujie* @since 2022-04-05**/
@Data
public class AliProperties {/*** 应用id*/public String appId;/*** 应用私钥*/public String alipayPrivateKey;/*** 支付宝公钥*/public String alipayPublicKey;/*** 字符编码*/public String charset;/*** 签名方式*/public String signType;/*** 数据格式*/public String format;/*** 商家id*/private String mchId;/*** 调用接口的url*/private String serverUrl;/*** 支付回调url*/private String notifyUrl;/*** pc支付前台通知*/private String returnUrl;/*** 退款url*/private String refundUrl;}/*** @author zhangyujie* @since 2022-04-05**/
@Configuration
@ConfigurationProperties(prefix = "app.pay")
public class AppProperties {private AliProperties ali = new AliProperties();public AliProperties getAli() {return ali;}public void setAli(AliProperties ali) {this.ali = ali;}
}

创建AlipayClient

    @Resourceprivate AppProperties appProperties;/*** 阿里 sdk 封装*/private AlipayClient alipayClient;@PostConstructpublic void initMethod() {alipayClient = new DefaultAlipayClient(appProperties.getAli().getServerUrl(),appProperties.getAli().getAppId(),appProperties.getAli().getAlipayPrivateKey(),appProperties.getAli().getFormat(),appProperties.getAli().getCharset(),appProperties.getAli().getAlipayPublicKey(),appProperties.getAli().getSignType());}

获取支付二维码

 /*** 支付宝扫码支付生成二维码响应到浏览器** @param amount* @param response* @return*/public void aliQrCodePay(Integer amount, HttpServletResponse response) throws Exception {AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();Map<String, String> params = new TreeMap<>();params.put("out_trade_no", RandomUtil.randomNumbers(10));params.put("total_amount", amount.toString());params.put("subject", "备注");params.put("body", "详情");params.put("store_id", "NJ_2031");params.put("timeout_express", "90m");request.setBizContent(objectMapper.writeValueAsString(params));request.setNotifyUrl(appProperties.getAli().getNotifyUrl());AlipayTradePrecreateResponse responseData = alipayClient.execute(request);log.info("response:{}", responseData.getBody());String qrCode = responseData.getQrCode();if (!ObjectUtils.isEmpty(qrCode)) {// 这里工具类是根据支付宝返回的qrCode利用谷歌的zxing包生成的二维码放进responsePaymentUtils.createQRCode(qrCode, response);}}

测试生成二维码:

/*** @author zhangyujie* @since 2022-04-05**/
@Slf4j
@RestController
@RequestMapping(value = "/api/pay/ali")
public class AliPayController {@Resourceprivate AliPayService aliPayService;/*** 支付宝扫码支付预下单** @param amount* @param response* @return* @throws Exception*/@GetMapping("/qrcode")public void qrCodePay(Integer amount, HttpServletResponse response) throws Exception {aliPayService.aliQrCodePay(amount, response);}}

可以看到我们的sdk客户端创建的没问题,参数一切正常:这是调用返回的二维码字符串:

根据支付宝返回的qrCode利用谷歌的zxing包生成的二维码放进response

 public static void createQRCode(String content, HttpServletResponse response) {int width = 300, height = 300;String format = "png";Map<EncodeHintType, Object> hashMap = new HashMap<>();hashMap.put(EncodeHintType.CHARACTER_SET, StandardCharsets.UTF_8);hashMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);hashMap.put(EncodeHintType.MARGIN, 1);try {response.setHeader("Cache-control", "no-cache");response.setHeader("Pragma", "no-cache");response.setHeader("content-type", "image/png");response.setCharacterEncoding(StandardCharsets.UTF_8.displayName());response.setDateHeader("Expires", 0);BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hashMap);BufferedImage img = MatrixToImageWriter.toBufferedImage(bitMatrix);ImageIO.write(img, format, response.getOutputStream());} catch (Exception e) {log.warn("create QRCode error message:{}", e.getMessage());}}

postmain返回结果:

可以看到二维码是正常出来的,接下来我们使用沙箱APP扫码支付出现问题,咨询了支付宝开发组客服得知沙箱APP在升级,正常情况下是可以看到沙箱app的余额的,现在查看余额也是提示网络不给力请稍后重试

支付宝提现

 /*** 支付宝提现** @param amount*/public Result deposit(Integer amount) {AlipayFundTransToaccountTransferModel transferModel = new AlipayFundTransToaccountTransferModel();transferModel.setOutBizNo(RandomUtil.randomNumbers(10));transferModel.setAmount("0.01");transferModel.setPayeeAccount("收款方账户");transferModel.setPayeeRealName("收款方真实姓名");transferModel.setPayerShowName("付款方姓名");transferModel.setRemark("remark");// ALIPAY_LOGONID:支付宝登录号,支持邮箱和手机号格式transferModel.setPayeeType("ALIPAY_LOGONID");try {AlipayFundTransToaccountTransferRequest request = new AlipayFundTransToaccountTransferRequest();request.setBizModel(transferModel);AlipayFundTransToaccountTransferResponse response = alipayClient.execute(request);} catch (AlipayApiException e) {log.info("ali deposit error message:{}", e.getMessage());return Result.success(CommonMessage.ALI_DEPOSIT_SUCCESS);}return Result.error(CommonMessage.ALI_DEPOSIT_FAILED);}

PC支付

 /*** 阿里pc支付** @param amount* @param servletRequest* @return*/public String aliPcPay(Integer amount, HttpServletRequest servletRequest) throws Exception {AlipayTradePagePayRequest payRequest = new AlipayTradePagePayRequest();// 前台通知payRequest.setReturnUrl(appProperties.getAli().getReturnUrl());// 后台回调payRequest.setNotifyUrl(appProperties.getAli().getNotifyUrl());Map<String, String> params = new TreeMap<>();params.put("out_trade_no", "订单号");// 订单金额:元params.put("total_amount", amount.toString());params.put("subject", "订单标题");// 实际收款账号,一般填写商户PID即可params.put("seller_id", appProperties.getAli().getMchId());// 电脑网站支付params.put("product_code", "FAST_INSTANT_TRADE_PAY");params.put("body", "两个橘子");payRequest.setBizContent(objectMapper.writeValueAsString(params));log.info("业务参数:" + payRequest.getBizContent());String result = CommonMessage.ERROR.getMessage();try {result = alipayClient.pageExecute(payRequest).getBody();} catch (AlipayApiException e) {log.error("ali pay error message:{}", e.getMessage());}return result;}

支付宝退款

/*** 支付宝退款* @param outTradeNo* @param tradeNo* @param amount* @param servletRequest* @return* @throws Exception*/public Result aliRefund(String outTradeNo,String tradeNo,Integer amount, HttpServletRequest servletRequest) throws Exception {// 创建退款请求builder,设置请求参数AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();Map<String, String> params = new TreeMap<>();// 必须 商户订单号params.put("out_trade_no", outTradeNo);// 必须 支付宝交易号params.put("trade_no", tradeNo);// 必须 退款金额params.put("refund_amount", amount.toString());// 可选 代表 退款的原因说明params.put("refund_reason", "退款的原因说明");// 可选 标识一次退款请求,同一笔交易多次退款需要保证唯一(就是out_request_no在2次退款一笔交易时,要不一样),如需部分退款,则此参数必传params.put("out_request_no", RandomUtil.randomNumbers(10));// 可选 代表 商户的门店编号params.put("store_id", "90m");request.setBizContent(objectMapper.writeValueAsString(params));AlipayTradeRefundResponse responseData = alipayClient.execute(request);if (responseData.isSuccess()) {log.info("ali refund success tradeNo:{}", "订单号");return Result.success(CommonMessage.SUCCESS);}log.info("ali refund failed tradeNo:{}", "订单号");return Result.error(CommonMessage.ALI_PAY_REFUND_FAILED);}

APP支付

/*** 支付宝App支付** @param amount* @param servletRequest* @return*/public String appPay(Integer amount, HttpServletRequest servletRequest) {AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();// SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();model.setBody("购买手机");model.setSubject("iPhone 13 pro max");model.setOutTradeNo(RandomUtil.randomNumbers(10));model.setTimeoutExpress("30m");model.setTotalAmount(amount.toString());model.setProductCode("QUICK_MSECURITY_PAY");request.setBizModel(model);request.setNotifyUrl(appProperties.getAli().getNotifyUrl());try {// 这里和普通的接口调用不同,使用的是sdkExecuteAlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);//就是orderString 可以直接给客户端请求,无需再做处理。log.info("orderString:{}", response.getBody());return response.getBody();} catch (AlipayApiException e) {e.printStackTrace();}return null;}

支付宝回调地址

 /*** 支付回调通知** @param request* @param response*/public void aliNotify(HttpServletRequest request, HttpServletResponse response) throws IOException {String requestXml = PaymentUtils.getRequestData(request);Map requestMap = PaymentUtils.xmlToMap(requestXml);Assert.notNull(requestMap, CommonMessage.XML_DATA_INCORRECTNESS.getMessage());// 当返回的return_code为SUCCESS则回调成功if (requestMap.get("code").equals(10000)) {log.info("notify success");} else {log.error("notify failed");}}

详细代码地址(由于appid为个人的,示例中已改为xxx,请替换自己的appid和公私钥)

接入alipay-sdk相关推荐

  1. Unity Android平台接入支付宝SDK

    这篇文章前面讲的创建Android Studio工程的流程是不正确的!!! 正确的流程请参见:Unity Android平台下插件/SDK开发通用流程 最近帮一个群里的朋友接了一下支付宝的SDK,开发 ...

  2. [Android开发]cocos2dx工程中接入支付宝sdk

    cocos2dx工程中接入支付宝sdk 1. 首先去支付宝官网下载开发者文档 2. 然后按着开发者文档将支付宝的sdk导入到你的工程中,并关联到工程中,步骤入下图: (1)将从支付宝官方网站获得的支付 ...

  3. cocos2dx工程中接入支付宝sdk

    [摘要]本文是对cocos2dx工程中接入支付宝sdk的讲解,对学习Android编程技术有所帮助,与大家分享. 1. 首先去支付宝官网下载开发者文档 2. 然后按着开发者文档将支付宝的sdk导入到你 ...

  4. Unity接入安卓sdk查看应用内存占用

    注:若不清楚如何在unity中接入android sdk可先了解下相关流程.项目地址:http://download.csdn.net/download/yhuangher/9976564 在项目后期 ...

  5. 手把手教你简单接入微信SDK

    就看微信现在这么火的样子,如果你的APP不接入微信的SDK好像就有点脱离了时代大车轮一样.一个成功的APP,不单单凭借着一个好的想法,一个好的功能,最主要还是用户量.用户量就好像是水,我们的APP就一 ...

  6. Xamarin只言片语3——Xamarin.Android下支付宝(Alipay SDK)使用

    开发环境Visual Studio 2015,Xamarin 3.11.1537,Xamarin Android5.1.7.12 下载支付宝移动支付的SDK(http://doc.open.alipa ...

  7. ios sdk 穿山甲_Creator iOS接入穿山甲SDK

    首先介绍一下 .m文件与.mm文件有什么区别 .m文件 支持C ,OC .mm文件 支持C,C++,OC OC 与 TS 互调,例子有很多,比如官方的例子里面就有 TS 调用OC的时候有个点 初学者可 ...

  8. 从 smali 接入第三方 sdk

    遇到过这种场景吗? 什么样的场景需要从 smali 语言层面接入第三方 sdk 呢? 一般都是 java 语言接口,一目了然,搞个 smali 不是没事找事? 其实不然 场景不同,我还真就遇到这种常规 ...

  9. 如何实现在线直播源码的美颜功能——接入美颜SDK

    美颜是在线直播源码很重要的一部分功能,为了保证美颜质量并降低开发时间,在线直播源码会接入第三方美颜SDK,实现系统的美颜功能,接下来就介绍一下,在线直播源码是怎么接入美颜SDK的. SDK接入流程 1 ...

  10. 直播平台接入美颜SDK已成刚需,它将带来哪些影响?

    2020年以来,直播行业又迎来新一轮春天.小编查阅了相关信息得来,截至2020年3月,我国网络直播用户规模达5.60亿,较2018年底增长1.63亿,占网民整体的62.0%.看到这个数据小编心中不由得 ...

最新文章

  1. 【控制】遗传算法(GA,Genetic Algorithm)及 Matlab 实现 代码详细版
  2. Qt程序窗口关闭不退出而最小化到托盘的方法
  3. PHP超链接传数据库值格式,php – 使用超链接更新数据库
  4. pku1363 Rails
  5. C#调用C++的DLL所有数据类型转换方式
  6. Java 8 你需要掌握的新特性
  7. 关键词工具(seo常用关键词工具有哪些?)
  8. 高速公路ETC自由流收费技术
  9. CF1528B Kavi on Pairing Duty(dp)
  10. Linux怎么运行lisp,Lisp - Ubuntu 中的编程语言_Linux编程_Linux公社-Linux系统门户网站...
  11. MAC 录屏工具,录制视频制作GIF—— LICEcap
  12. 多多情报通:拼多多推广哪个效果好?有什么推广技巧?
  13. 2017计算机开机号202,福彩3D2017第202期彩吧3D开机号429
  14. idea设置单行注释格式(包括配置文件)
  15. 电脑安卓手机模拟器怎么修改IP地址
  16. mysql安装时的英文_安装MySQL遇到的常见英文翻译
  17. 参考文献交叉引用的使用方法(word和wps)
  18. 图形图形处理方面的一位微软专家的主页,
  19. 我擦!硬盘文件全被人删了!!
  20. 十六计使SEO优化道路了如指掌

热门文章

  1. 植物大战僵尸java圣诞版,植物大战僵尸2圣诞节版
  2. python小游戏大合集(有注释,持续更新)
  3. 有色金属行业数字化之路探析
  4. 转载:Eb/No和SNR的区别
  5. 机器人磨内孔_半导体阀块内孔机器人打磨,效果超乎想象!
  6. 刺探内心深处远古的记忆OnDragListener
  7. Ymir初级使用教程
  8. 三菱PLC MC协议的配置和使用简析
  9. 1.3 C++常量 (Constants )
  10. 用JAVA写出1到999的随性化数_OO第一单元——谜之随性总结