支付宝第三方接口支付实现
注册沙箱账号
到蚂蚁金服注册开发者账号,注册地址:https://open.alipay.com,用你的 支付宝 账号扫码登录,完善个人信息,选择服务类型。
根据情况选择接入方式,我们这里选择自研开发者,如果已经注册过的省略。
选择 开发者中心 --> 研发服务 --> 沙箱,进入沙箱管理界面。
进入沙箱,第一次需要填写信息,记下appId,公钥设置处需要把下面步骤生成的公钥设置到这里。
生成公私秘钥
登录官方地址: https://docs.open.alipay.com/291/105971,进入秘钥生成页面。
打开下载的工具,运行程序,选择 JAVA 2048 方式,点击生成秘钥。
把此处生成的公钥复制设置到沙箱环境,就是上面的设置公钥配置,然后把公私秘钥保存起来,以备后用。
创建SpringBoot项目
1.在pom.xml中导入支付相关依赖。
2.配置config文件
package com.etc.config; import java.io.FileWriter; import java.io.IOException; /* * *类名:AlipayConfig *功能:基础配置类 *详细:设置帐户有关信息及返回路径 *修改日期:2017-04-05 *说明: *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 */ public class AlipayConfig { //↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号 public static String app_id = ""; // 商户私钥,您的PKCS8格式RSA2私钥 public static String merchant_private_key = ""; // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。 public static String alipay_public_key = ""; // 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 public static String notify_url = "http://127.0.0.1:7777/Home"; // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 public static String return_url = "http://127.0.0.1:7777/Home"; // 签名方式 public static String sign_type = "RSA2"; // 字符编码格式 public static String charset = "utf-8"; // 支付宝网关 public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do"; // 支付宝网关 public static String log_path = "C:\\"; }
3.编写Controller
package com.etc.controller; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.request.AlipayTradePagePayRequest; import com.etc.config.AlipayConfig; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @CrossOrigin @Api(tags = "支付宝第三方接口支付") @RestController @RequestMapping("/PayController") public class PayController { @RequestMapping("/pay") @ApiOperation("阿里支付") public void payController(HttpServletRequest request, HttpServletResponse response) throws IOException { //设置请求编码 response.setContentType("text/html;charset=utf-8"); //获得初始化的AlipayClient AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, 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); //商户订单号,商户网站订单系统中唯一订单号,必填 String out_trade_no = new String(request.getParameter("WIDout_trade_no").getBytes("UTF-8"),"UTF-8"); //付款金额,必填 String total_amount = new String(request.getParameter("WIDtotal_amount").getBytes("UTF-8"),"UTF-8"); //订单名称,必填 String subject = new String(request.getParameter("WIDsubject").getBytes("UTF-8"),"UTF-8"); //商品描述,可空 String body = new String(request.getParameter("WIDbody").getBytes("UTF-8"),"UTF-8"); System.out.println(out_trade_no); alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\"," + "\"total_amount\":\""+ total_amount +"\"," + "\"subject\":\""+ subject +"\"," + "\"body\":\""+ body +"\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); //若想给BizContent增加其他可选请求参数,以增加自定义超时时间参数timeout_express来举例说明 //alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\"," // + "\"total_amount\":\""+ total_amount +"\"," // + "\"subject\":\""+ subject +"\"," // + "\"body\":\""+ body +"\"," // + "\"timeout_express\":\"10m\"," // + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); //请求参数可查阅【电脑网站支付的API文档-alipay.trade.page.pay-请求参数】章节 //请求 String form=""; try { form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单 } catch (AlipayApiException e) { e.printStackTrace(); } response.setContentType("text/html;charset=" + AlipayConfig.charset); response.getWriter().write(form);//直接将完整的表单html输出到页面 response.getWriter().flush(); response.getWriter().close(); } }
4.在resources路径下创建static资源,测试支付。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="PayController/pay" method="post"> 订单号:<input type="text" name="WIDout_trade_no" required><br/> 订单名称:<input type="text" name="WIDsubject"><br/> 付款金额:<input type="text" name="WIDtotal_amount" required><br/> 商品描述:<input type="text" name="WIDbody"><br/> <input type="submit" value="下单"> <input type="reset" value="重置"> </form> </body> </html>
5. 在浏览器端访问 index.html页面,填写表单信息之后,点击提交,此时会跳转到扫码支付页码。
可以选择支付的方式:
(1)下载沙箱版本的支付宝扫码支付
(2)输入账号和密码支付
输入的是买家的账号和密码