PC端支付宝支付接口实现

Posted zhetiankj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PC端支付宝支付接口实现相关的知识,希望对你有一定的参考价值。

首先要2个jar包

一个是alipay-sdk--java-4.9.79.ALL.jar

一个是aliyun-java-sdk-dysmsapi-1.0.0

 

基本配置信息:

package com.zhetian.www.alibaba;

import java.io.FileWriter;
import java.io.IOException;

/**
 * @Copyright (C)遮天网络有限公司
 * @Author: YUAN HUAI XING
 * @Date 2020/3/31 17:34
 * @Descripthion:
 **/

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://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    public static String return_url = "";

    // 签名方式
    public static String sign_type = "RSA2";

    // 字符编码格式
    public static String charset = "utf-8";

    // 支付宝网关
    public static String gatewayUrl ="http://openapi.alipaydev.com/gateway.do";

    // 支付宝网关
    public static String log_path = "C:\";


//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

    /**
     * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
     * @param sWord 要写入日志里的文本内容
     */
    public static void logResult(String sWord) {
        FileWriter writer = null;
        try {
            writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis()+".txt");
            writer.write(sWord);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static String getorderNo() {
        String num = "";
        for (int i = 0 ; i < 10 ; i ++) {
            num = num + String.valueOf((int) Math.floor(Math.random() * 9 + 1));
        }
        return num;
    }
}

 

调用支付接口

package com.zhetian.www.alibaba;

import com.alibaba.fastjson.JSON;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.response.AlipayTradePagePayResponse;

import java.util.HashMap;

/**
 * @Copyright (C)遮天网络有限公司
 * @Author: YUAN HUAI XING
 * @Date 2020/3/31 18:34
 * @Descripthion:
 **/

public class AliPayServer {

    public String pay(String orderOn, Integer productPrice, String productName) throws Exception {
        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);  //设置异步回调通知
        //设置支付参数

        HashMap<Object, Object>  hashMap = new HashMap<>();
       hashMap.put("out_trade_no",orderOn);
       hashMap.put("total_amount",productPrice);
       hashMap.put("subject",productName);
       hashMap.put("product_code","FAST_INSTANT_TRADE_PAY");
       hashMap.put("timeout_express", "90m");
       String s1 = JSON.toJSONString(hashMap);

       alipayRequest.setBizContent(s1);



       String s="";
        System.out.println(s);
        //请求
        try {
            AlipayTradePagePayResponse execute = alipayClient.pageExecute(alipayRequest);
            s = JSON.toJSONString(execute);
            System.out.println(s);


        } catch (AlipayApiException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return s;

    }

}

点击购买跳转支付宝支付接口

    /**
     * 点击购买执行操作
     * @return
     */
    @RequestMapping("/listData")
    @ResponseBody
    public Result listData(HttpServletRequest request, Integer id, Order order, HttpServletResponse response) throws Exception {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        Result result = new Result();
        //1.接收商品id
        Product product = productService.ProductById(id);
        //2.根据商品id,获取价格,subject 产品名称
        String productName = product.getProductName();//产品名称
        Integer productPrice = product.getProductPrice();//产品价格
        // 1-等待支付,2-支付失败,3-支付成功
        String state ="2";
        HttpSession session = request.getSession();
        LoginUser data = (LoginUser)session.getAttribute("data");
        String userName = data.getUserName();
        LoginUser loginUser = loginUserService.UserByuserName(userName);
        Integer userId = loginUser.getId();//获取用户id
        //3.创建订单  支付状态 等待支付
        String orderNo = getorderNo();
        order.setUserId(userId);
        order.setProductId(id);
        order.setOrderOn(orderNo);
        order.setProductName(productName);
        order.setProductPrice(productPrice);
        order.setState(state);
        Date date = new Date();
        order.setCreateTime(date);
        orderService.saveOrder(order);
        //4.向支付宝获取支付信息
        request.setAttribute("orderNo",orderNo);
        AliPayServer aliPayServer = new AliPayServer();
        String pay = aliPayServer.pay(orderNo, productPrice, productName);
        JSONObject jsonObject = JSON.parseObject(pay);
        String body = jsonObject.getString("body");
        result.setData(body);
         return  result;
    }

同步异步返回:

package com.zhetian.www.controller;


import com.alipay.api.internal.util.AlipaySignature;
import com.zhetian.www.alibaba.AlipayConfig;
import com.zhetian.www.model.Order;
import com.zhetian.www.service.impl.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import static com.zhetian.www.alibaba.AlipayConfig.alipay_public_key;

@Controller
@RequestMapping("/callback")
public class PayCallBackController {
    @Autowired
    private OrderService orderService;



    /**
     * 同步回调
     *
     * @param request
     * @throws Exception
     */
    @ResponseBody
    @RequestMapping("/returnUrl")
    public ModelAndView returnUrl(HttpServletRequest request) throws Exception {
        ModelAndView mav = new ModelAndView();
            System.out.println("前往支付成功页面");
            mav.setViewName("/tick/list");
        return mav;
    }


    /**
     * 支付宝服务器异步通知
     *
     * @param request
     * @throws Exception
     */
    @RequestMapping("/notifyUrl")
    @ResponseBody
    public String notifyUrl(HttpServletRequest request) throws Exception {
        // 获取支付宝GET过来反馈信息
        Map<String, String> params = new HashMap<String, String>();
        Map<String, String[]> requestParams = request.getParameterMap();
        for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
            String name = (String) iter.next();
            String[] values = (String[]) requestParams.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
            }
            params.put(name, valueStr);
        }

        boolean signVerified = AlipaySignature.rsaCheckV1(params, alipay_public_key, AlipayConfig.charset,
                AlipayConfig.sign_type); // 调用SDK验证签名

        if (signVerified) { // 验证成功 更新订单信息
            System.out.println("异步通知成功");
            // 1.商户订单号
            String orderOn = request.getParameter("out_trade_no");

//            // 2.交易状态
           String trade_status = request.getParameter("trade_status");
            if (trade_status.equals("TRADE_SUCCESS")){
                //3.订单号和支付状态修改订单
                // 修改数据库
                Order order = new Order();
                order.setState("3");
                Date date = new Date();
                order.setUpdateTime(date);
                order.setOrderOn(orderOn);
                orderService.updaetOrder(order);
                return "success";
            }
            return "fail";
        } else {
            System.out.println("异步通知失败");
            return "fail";
        }
    }

 

 

@注:本博客仅为个人学习笔记。 所属人:Yuan 

以上是关于PC端支付宝支付接口实现的主要内容,如果未能解决你的问题,请参考以下文章

H5处理支付宝接口返回form

PC电脑端支付宝扫码付款出现编码错误提示原因

Python接入支付宝进行PC端支付

实现使用支付宝交易接口实现机构端代理系统的总结

pc 端支付宝支付流程

实现使用支付宝交易接口实现机构端代理系统的总结