首先我们先了解到APPID,公钥私钥等一系列问题。
APPID很简单理解,发起请求的应用ID。下面的截图是沙箱环境中的APPID
那什么是公钥私钥呢
其实网络上传输信息其实都是不安全的,但是为了考虑安全性,我们要把一些信息需要进行加密,即使别人获取到了我们网络上传输的东西,因为是加密的,别人也是无法获取其中数据的。
就刚才所讲的加密,公钥私钥就是用来加密解密的东西。
点击上图所示中RSA2(SHA256)密钥(推荐) 会出现应用公钥和支付宝公钥。支付宝公钥需要我们待会复制粘贴到我们的代码当中。应用公钥需要我们使用支付宝开放平台开发助手去生成本地的应用公钥和私钥,我们需要将我们生成的公钥复制粘贴到出现那个弹出框里面去。本地生成的私钥也是待会应用到我们的代码当中。
废话不多说 直接上代码
首先我们需要导入依赖包
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.0.0</version>
</dependency>
apipayconfig.java
package com.abcd.apipayconfig;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "alipay")
@Data
@Component
public class AlipayConfig {
// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号,开发时使用沙箱提供的APPID,生产环境改成自己的APPID
public String APP_ID = "上述讲述到的APPID";
// 商户私钥,您的PKCS8格式RSA2私钥
public String APP_PRIVATE_KEY = "本地生成的私钥";
// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
public String ALIPAY_PUBLIC_KEY = "支付给出的公钥";
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public String notify_url = "www.baidu.com";
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问(其实就是支付成功后返回的页面)
public String return_url = "www.baidu.com";
// 签名方式
public String sign_type = "RSA2";
public String format = "json";
// 字符编码格式
public String CHARSET = "utf-8";
// 支付宝网关,这是沙箱的网关
public String gatewayUrl = "https://openapi.alipay.com/gateway.do";
}
controller层代码 PayController .java
package com.abcd.controller;
import com.abcd.apipayconfig.AlipayConfig;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeWapPayModel;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/pay")
public class PayController {
@Autowired
AlipayConfig alipayConfig;
@GetMapping("/apipay")
// 订单号 订单的名称 付款金额 商品的描述 时间 商品码
public String pay(String orderid, String ordername, String orderprice, String body, String timeout, String code) throws AlipayApiException {
// 1、客户端 封装Rsa签名方式
// 参数1,请求网关
// 参数2,收款人ID
// 参数3,支付宝私钥
// 参数4,返回的格式
// 参数5,字符编码格式
// 参数6,支付宝公钥
// 参数7,加密方式
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig.getGatewayUrl(),
alipayConfig.getAPP_ID(),alipayConfig.getAPP_PRIVATE_KEY(),
alipayConfig.getFormat(),alipayConfig.getCHARSET(),alipayConfig.getALIPAY_PUBLIC_KEY(),
alipayConfig.getSign_type());
// 2、创建request请求
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
// 3、封装传入参数
AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
model.setOutTradeNo(orderid); //商品Id
model.setSubject(ordername); //商品名称
model.setTotalAmount(orderprice);//商品金额
model.setBody(body);//商品描述
model.setTimeoutExpress(timeout);//请求超时时间
model.setProductCode(code);//商品码
request.setBizModel(model);
// 设置异步回调地址
request.setNotifyUrl(alipayConfig.getNotify_url());
// 设置同步回调地址
request.setReturnUrl(alipayConfig.getReturn_url());
// 生成表单
String form = alipayClient.pageExecute(request).getBody();
System.out.println(form);
return form;
}
}
异步回调地址和同步回调地址支付成功后跳转到支付成功的界面。其地址只支持网络地址!!!
详情可看代码注释!
附上github地址:https://github.com/PloughingNorth/alipay