1.在实现前我们得先了解支付宝支付功能-他是需要一个真实的软件 但我们没有真实的应用软件,所以支付宝给我们提供了一个沙箱的功能。沙箱就是一个虚拟的假的应用软件。了解沙箱可以看支付宝文档中心。----沙箱环境 | 开放平台
2.我们创建自己的沙箱账号
根据文档的操作我们进去沙箱环境,使用自己的支付宝登录
我们可以看到APPID
点击公钥的查看 查看 应用私钥 和 支付宝公钥
右侧沙箱账号 里面 的买家账号和密码 就是我们支付的时候使用的账号,金钱不够可以充值,里面还可以下载沙箱版的支付宝,就可以使用沙箱版的支付宝扫码支付 ,沙箱版支付宝登录使用沙箱买家账号
3.编写代码
我们先导包,支付宝的包
<!--支付宝包--> <!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java --> <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.22.0.ALL</version> </dependency>
编写信息 config类
直接在config下创建一个类就行
public class AliPayConfig { //APPID对应支付宝账号 public static String APP_ID="20210...."; //应用私钥 public static String MERCHANT_PRIVATE_KEY="MIIEvgIBADANBgkqh..."; //支付宝私钥 public static String ALIPAY_PUBLIC_KEY="MIIBI......"; //这个是支付成功后要跳转到哪里的页面 success是我控制层里面的路径 改成自己的 也可以是一个页面.html public static String NOTIFY_URL="http://127.0.0.1:80/success"; //页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 和上面一样 public static String RETURN_URL="http://127.0.0.1:80/success"; //签名方式 这个不用改 public static String SIGN_TYPE="RSA2"; //字符编码格式 不用改 public static String CHARSET="utf-8"; //支付宝网关(沙盒环境) 不用改 public static String GATEWAY_URL="https://openapi.alipaydev.com/gateway.do"; }
编写操作类
编写了一个controller
//支付 @ResponseBody @PostMapping("/toBuyByAli") public String tobuy(@RequestParam("out_trade_no") String out_trade_no, @RequestParam("total_amount") String total_amount, @RequestParam("subject") String subject, @RequestParam("body") String body){ //获得初始化的AlipayClient AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.GATEWAY_URL, AliPayConfig.APP_ID, AliPayConfig.MERCHANT_PRIVATE_KEY, "json", AliPayConfig.CHARSET, AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.SIGN_TYPE); //设置请求参数 AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); alipayRequest.setReturnUrl(AliPayConfig.RETURN_URL); //设置同步回调通知 alipayRequest.setNotifyUrl(AliPayConfig.NOTIFY_URL); //设置异步回调通知 //设置支付参数 alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"total_amount\":\"" + total_amount + "\"," + "\"subject\":\"" + subject + "\"," + "\"body\":\"" + body + "\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); //请求 String result = null; try { result = alipayClient.pageExecute(alipayRequest).getBody(); } catch (AlipayApiException e) { // TODO Auto-generated catch block e.printStackTrace(); } return result; }
四个参数得从前端页面获取
@RequestParam("out_trade_no") String out_trade_no, @RequestParam("total_amount") String total_amount, @RequestParam("subject") String subject, @RequestParam("body") String body
我使用了ajax方式
当点击去支付 会实现tobuy()方法
function tobuy(){ var out_trade_no=Math.random().toString(36).substr(2,10);//订单单号 可以根据自己喜欢生成随机的唯一的单号 可以根据自己喜欢改 var total_amount=document.getElementById("sumprice").innerText;//金钱 获取页面中金钱数 可以根据自己喜欢改 var subject="测试订单名称";// 可以根据自己喜欢改 var body="测试描述";//可以根据自己喜欢改 var xmlhttp; if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.open("POST","http://localhost/toBuyByAli?out_trade_no="+out_trade_no+ "&total_amount="+total_amount+"&subject="+subject+"&body="+body,true); //路径和参数改成自己的 xmlhttp.withCredentials=true; xmlhttp.crossDomain=true; xmlhttp.send(); xmlhttp.onreadystatechange=function() { //判断readyState就绪状态是否为4,判断status响应状态码是否为200 if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.write(xmlhttp.responseText); } } }
最后就实现了 因为 document.write(xmlhttp.responseText);返回的是一个from表单和一个js 这个js会执行form实现跳转 跳转支付宝支付页面。
我们使用准备的沙箱账号就可以支付了。
原理:可以查看支付宝文档中心,demo在线调试
版权声明:本文为apple_hjw原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。