沙箱支付:沙箱不是线上,是协助开发者进行接口功能开发及主要功能联调的模拟环境:
坑:
- application.properties中 不能用 _ 会提示找不到应该用 - 连接(alipay-public-key)
- 点击支付后跳转的页面不能用ajax的get请求实现
一:DEMO运行沙箱
看见demo可以先下载运行,然后仿照其代码
参考文档:当面付≠电脑支付;只是借鉴当面付的步骤来看懂电脑支付的DEMO
沙箱当面付引导
电脑网站支付Demo
1.打开沙箱
开发者中心》研发服务
发现有demo:下载下来尝试
2.填写密钥
参考文档
商户密钥:商户和支付宝双方
应用(APP)公钥:商户自己生成的APK,需要上传,用于验证此次交易是不是商户发起的
应用(APP)私钥:商户自己生成的,对请求字符串进行标签。
开发者(商户)密钥配置
后可以获取支付宝公钥
支付宝公钥(ALIPAY):商户验证结果是不是支付宝返回的额
1.下载并生成应用私钥
和应用公钥
2.在沙箱环境中填写密钥信息:并获得支付宝公钥
支付宝网关:open_api_domain
3.将demo导入eclipse:修改demo中的zfbinfo.properties
(电脑支付的话直接对着它的demo改更好)不要用这个当面付的demo
当面付(电脑支付不看这里,电脑版的会自动生成支付码):
4.运行main
5.得到qr_code,打开浏览器百度草料二维码复制获得二维码
6.按照使用安卓手机 下载的沙箱支付宝:用沙箱账号登录并且付款发现成功
电脑支付(当面付不用看):
将当面付中的properties内容对应复制到电脑支付AlipayConfig中;运行即可;直接弹出这个网页:
后文写的是两种结合的:因为不想在创建一个AlipayConfig;
在properties中写先执行构造方法,再注入成员变量 所以不能再构造方法中使用@Value来的变量;
二:项目部署沙箱
我是网页所以应该是电脑网站支付:
sdk软件开发工具包括广义上指辅助开发某一类软件的相关文档、范例和工具的集合。API(应用程序接口)是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。
参考电脑支付DEMO
前端:
profile.html
还需要传递页面上的总额,数量所以用 location.href
<a class="btn btn-success" href="javascript:;" th:data-id="${order.id}" onclick="dobuy(this)">购买</a>
function dobuy(e) {
var id = e.getAttribute("data-id");
var price = parseFloat($("#thisSum"+id).text());
var count = parseInt($("#inputNum"+id).val());
console.log("id="+id+",total="+price+",count="+count);
/* $.ajax({
type: "GET",
url: "/order",
dataType: "JSON",
contentType: 'application/json',
data: {
"id": id,
"total":price,
"amount":count
},
success:function (ret) {
console.log(ret)
}
}) 不能用AJAX!!!!!!!!!!*/
location.href="/order?id="+id+"&total="+price+"&amount="+count;
}
a标签是直接访问跳转到文件url,浏览器判断是个可下载文件就会自动下载。get是ajax,只能返回string类型的数据,而写出页面渲染url是一个对应的是一个文件流,ajax接收不到。
一定不能用ajax
配置文件
application.properties
直接添加上一个demo中的 ALIPAY的属性,之后在需要的地方用@Value
获取
@Value("${open-api-domain}")
private String serverUrl;
@Value("${appid}")
private String appId;
@Value("${private-key}")
private String privateKey;
@Value("${alipay-public-key}")
private String alipayPulicKey;
@Value("${return-url}")
private String returnUrl;
@Value(("${nofity-url"))
private String notifyUrl;
//服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
// 这个是支付成功失败以后的通知接口会返回相应的参数
nofity-url = http://localhost:8222/order/notify
//页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
// 这个是支付完成后的请求
return-url = http://localhost:8222/order/return
// 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。
timeout-express =30m;
后端
controller
@ResponseBody
@RequestMapping(value = "/order" ,produces = "text/html; charset=UTF-8")
public String doBuy(@RequestParam("id")Long id,
@RequestParam("amount")Integer amount,
@RequestParam("total")Float total,
HttpServletResponse response){
AlipayClient alipayClient = alipayProvider.createClien();
Orders thisOrder = orderService.updateOrderById(id, amount);
AlipayTradePagePayRequest alipayRequest = alipayProvider.trade_precreate(thisOrder, total);
String result = null;
try {
result = alipayClient.pageExecute(alipayRequest).getBody();
} catch (AlipayApiException e) {
e.printStackTrace();
}
return result;
}
/**
* notify.url.jsp
* @param request
* @param response
* @param model
* @return
*/
@RequestMapping("/order/notify")
public String doPost(HttpServletRequest request,
HttpServletResponse response,
Model model){
demo中notify.url.jsp中的代码
}}
/**
* 支付成功
* return_url.jsp
* @param request
* @param response
* @return
*/
@RequestMapping("/order/return")
public String doGet(HttpServletRequest request,
HttpServletResponse response,
Model model)
demo中return_url.jsp中的代码
还可以加上删除该成功的订单以及商品 加通知给卖家,买家等。
return "redirect:/"; 我选择返回首页
}
Proveder(AlipayProvider)
package com.cassiezys.transaction.provider;
/**
* Copyright,2020
* Author:曾念念
* Description:支付宝沙箱支付
*/
@Component
public class AlipayProvider {
@Value("${open-api-domain}")
private String serverUrl;
@Value("${appid}")
private String appId;
@Value("${private-key}")
private String privateKey;
@Value("${alipay-public-key}")
private String alipayPulicKey;
@Value("${return-url}")
private String returnUrl;
@Value("${nofity-url")
private String notifyUrl;
@Value("${timeout-express}")
private String timeout_express;
//实例化客户端
AlipayClient alipayClient;
public AlipayClient createClien() {
System.out.println(serverUrl);
this.alipayClient = new DefaultAlipayClient(serverUrl, appId, privateKey, "json", "utf-8", alipayPulicKey, "RSA2");
return alipayClient;
}
/**
* 创建支付码
* @param order
* @param total
* @return
*/
public AlipayTradePagePayRequest trade_precreate(Orders order, Float total) {
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(returnUrl);
alipayRequest.setNotifyUrl(notifyUrl);
//——请在这里编写您的程序(以下代码仅作参考)——
//业务逻辑部分(请开始你的数据调用)
//商户订单号,商户网站订单系统中唯一订单号,必填
String out_trade_no = "zhenbao" + System.currentTimeMillis() + (Math.random() * 10000000L) +"-"+ order.getId().toString();
//付款金额,必填
String total_amount = total.toString();
//订单名称,必填
String subject = order.getOuterTitle();
//商品描述,可空
String body = "商品描述(自定义)";
System.out.println(timeout_express);
alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\","
+ "\"total_amount\":\"" + total_amount + "\","
+ "\"subject\":\"" + subject + "\","
+ "\"body\":\"" + body + "\","
//* + "\"timeout_express\":\""+ timeout_express +"\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
return alipayRequest;
}
/**
* notify 和 return 中需要得到 支付宝返回过来的信息
* @param params
* @return
*/
public boolean signature(Map params) {
try {
return AlipaySignature.rsaCheckV1(params, alipayPulicKey, "utf-8", "RSA2"); //调用SDK验证签名
} catch (AlipayApiException e) {
e.printStackTrace();
}
return false;
}
}
来源:CSDN
作者:曾念念
链接:https://blog.csdn.net/n20164206199/article/details/104314241