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是我控制层里面的路径 改成自己的 也可以是一个页面.htmlpublic 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){//获得初始化的AlipayClientAlipayClient 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 blocke.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, Safarixmlhttp=new XMLHttpRequest();}else{// code for IE6, IE5xmlhttp=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响应状态码是否为200if (xmlhttp.readyState==4 && xmlhttp.status==200){document.write(xmlhttp.responseText);}} }
最后就实现了 因为 document.write(xmlhttp.responseText);返回的是一个from表单和一个js 这个js会执行form实现跳转 跳转支付宝支付页面。
我们使用准备的沙箱账号就可以支付了。
原理:可以查看支付宝文档中心,demo在线调试
Demo 在线调试 | 开放平台