注册沙箱账号

到蚂蚁金服注册开发者账号,注册地址:https://open.alipay.com,用你的 支付宝 账号扫码登录,完善个人信息,选择服务类型。

 

 

根据情况选择接入方式,我们这里选择自研开发者,如果已经注册过的省略。

选择 开发服务 –> 研发服务 –> 沙箱,进入沙箱管理界面。

 

 

进入沙箱,第一次需要填写信息,记下appId,公钥设置处需要把下面步骤生成的公钥设置到这里。

 

 

 

生成公私秘钥

登录官方地址: https://docs.open.alipay.com/291/105971,进入秘钥生成页面。

 

 

 

 下载相应的工具。

打开下载的工具,运行程序,选择 JAVA 2048 方式,点击生成秘钥。

 

把此处生成的公钥复制设置到沙箱环境,就是上面的设置公钥配置,然后把公私秘钥保存起来,以备后用。

添加依赖

添加项目依赖,主要是引入 alipay-sdk-java,提供支付宝支付支持。

pom.xml:

 

配置信息文件

因技术问题,暂且将相关信息以死值固定。

 

 

支付宝支付接口封装

AlipayUtil是对支付宝支付功能的封装。

AlipayUtil.java:

@Component
public class AlipayUtil {
    /**
     *
支付接口
    
*
     * @param
alipayBean
    
* @return
     * @throws
AlipayApiException
    
*/
   
public String pay(AlipayBean alipayBean) throws AlipayApiException
{
        // 1、获得初始化的AlipayClient
       
String serverUrl = PropertiesConfig.GATEWAY_URL;
        String appId = PropertiesConfig.APP_ID;
        String privateKey = PropertiesConfig.PRIVARY_KEY;
        String format = “json”;
        String charset = PropertiesConfig.CHARSET;
        String
alipayPublicKey = PropertiesConfig.PUBLIC_KEY;
        String signType = PropertiesConfig.SIGN_TYPE;
        String returnUrl = PropertiesConfig.RETURN_URL;
        String notifyUrl = PropertiesConfig.NOTIFY_URL;
        AlipayClient
alipayClient = new DefaultAlipayClient(serverUrl, appId, privateKey, format, charset, alipayPublicKey, signType);
        // 2、设置请求参数
       
AlipayTradePagePayRequest
alipayRequest = new AlipayTradePagePayRequest();
        // 页面跳转同步通知页面路径
       
alipayRequest.setReturnUrl(returnUrl);
        // 服务器异步通知页面路径
       
alipayRequest.setNotifyUrl(notifyUrl);
        // 封装参数
       
alipayRequest.setBizContent(JSON.toJSONString(alipayBean));
        // 3、请求支付宝进行付款,并获取支付结果(报500,有问题)
//            String result =
alipayClient.pageExecute(alipayRequest).getBody(); //
调用SDK生成表单
       
//通过以下代码进行提交请求会默认返回请求url字符串(返回url,打开跳转支付宝支付页面)
       
String result = alipayClient.pageExecute(alipayRequest, “GET”).getBody();

        //扫二维码支付(将responseqr_code制作成二维码)
       
//创建API对应的request
//        AlipayTradePrecreateRequest
request = new AlipayTradePrecreateRequest ();
//       
request.setNotifyUrl(“http://hj51eut.nat.ipyingshe.com:80/order/aliPayCallBack.do”);
//        request . setBizContent (
“{”   +
//               
“\’out_trade_no\’:\'”+alipayBean.getOut_trade_no()+”\’,”
+ //
商户订单号
//               
“\”total_amount\”:\'”+alipayBean.getTotal_amount()+”\’,”   +
//               
“\”subject\”:\'”+alipayBean.getSubject()+”\’,”   +
//               
“\”store_id\”:\”NJ_001\”,”   +
//               
“\”timeout_express\”:\'”+alipayBean.getTimeout_express()+”\’}”
); //
订单允许的最晚付款时间
//       
AlipayTradePrecreateResponse response = alipayClient.execute (request);
//        //
制作二维码
//        String body =
response.getBody();
//        JSONObject jsonObject = JSONObject.fromObject(body);
//        String qr_code =
jsonObject.getJSONObject(“alipay_trade_precreate_response”).getString(“qr_code”);

        // 返回付款信息
       
return result;
    }
}

 

接口调用参数封装对象如下。

AlipayBean.java

/**
 *
支付实体对象
 
* 根据支付宝接口协议,其中的属性名,必须使用下划线,不能修改
 
* @author suntong
 */
@Data
public class AlipayBean {
    /**
     *
商户订单号,必填
    
*
     */
   
private String out_trade_no;
    /**
     *
订单名称,必填
     
*/
   
private String subject;
    /**
     *
付款金额,必填
    
* 根据支付宝接口协议,必须使用下划线
    
*/
   
private String total_amount;
    /**
     *
商品描述,可空
    
*/
   
private String body;
    /**
     *
超时时间参数
    
*/
   
private String timeout_express= “10m”;

    //商户门店编号
   
private String store_id;
    /**
     *
产品编号
    
*/
   
private String product_code= “FAST_INSTANT_TRADE_PAY”;

    public String getOut_trade_no() {
        return out_trade_no;
    }
    public void setOut_trade_no(String out_trade_no) {
        this.out_trade_no
= out_trade_no;
    }
    public String getSubject() {
        return subject;
    }
    public void setSubject(String subject)
{
        this.subject =
subject;
    }
    public String getTotal_amount() {
        return total_amount;
    }
    public void setTotal_amount(String total_amount) {
        this.total_amount
= total_amount;
    }
    public String getBody() {
        return body;
    }
    public void setBody(String body) {
        this.body = body;
    }
    public String getTimeout_express() {
        return timeout_express;
    }
    public void setTimeout_express(String timeout_express) {
        this.timeout_express
= timeout_express;
    }
    public String getProduct_code() {
        return product_code;
    }
    public void setProduct_code(String product_code) {
        this.product_code
= product_code;
    }
    public String getStore_id() {
        return store_id;
    }
    public void setStore_id(String store_id) {
        this.store_id
= store_id;
   
}

}

 

订单业务封装

订单业务提供支付宝支付接口 alipay,内部通过调用 PayService 完成订单支付。

OrderController.java

/* 订单接口 */
@Controller
@RequestMapping("/home/order")
public class OrderController {

 

@Autowired
private PayService payService;//调用支付服务

 

/*阿里支付*/
   
@PostMapping("/alipay")
    @ResponseBody
    public AjaxResult alipay(String out_trade_no, String subject, String total_amount, String body,Long courseId) throws AlipayApiException {
        //发起支付
       
AlipayBean alipayBean = new AlipayBean();
        alipayBean.setOut_trade_no(out_trade_no);
        alipayBean.setSubject(subject);
        alipayBean.setTotal_amount(total_amount);
        String ids= courseId +","+ student.getStudentId();
        alipayBean.setBody(ids);
        String qr_code=payService.aliPay(alipayBean);
        return AjaxResult.success(qr_code);
    }

}

PayService 封装了 Alipay, 统一对外提供的支付服务接口。

PayService.java 
/**
 *
支付服务
 
* @author suntong
 */
public interface PayService {

    /**
     *
支付宝支付接口
    
* @param
alipayBean
    
* @return
     * @throws
AlipayApiException
     
*/
   
String aliPay(AlipayBean
alipayBean) throws AlipayApiException;
    }

支付服务的实现类,通过对各种支付代码的调用,统一对外提供支付服务。

PayServiceImpl.java

@Service
public class PayServiceImpl implements PayService {

    @Autowired
    private AlipayUtil alipay;

    @Override
    public String aliPay(AlipayBean alipayBean) throws AlipayApiException {
        return alipay.pay(alipayBean);
    }

}

测试页面

创建一个 index.html 页面,用于输入订单信息,并进行支付。

(必备字段)

<dt>商户订单号 :</dt>
<dd>
    <input id="WIDout_trade_no" name="out_trade_no"/>
</dd>
<hr class="one_line">
<dt>订单名称 :</dt>
<dd>
    <input id="WIDsubject" name="subject"/>
</dd>
<hr class="one_line">
<dt>付款金额 :</dt>
<dd>
    <input id="WIDtotal_amount" name="total_amount"/>
</dd>
 

内网穿透

若项目在内网的环境下,并且需要进行支付成功后回调,需进行内网穿透。
以下将使用免费的工具(闪库)进行操作。

 

 

 

版权声明:本文为dream-007原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/dream-007/p/14701653.html