支付宝手机网站支付对接(java)

以下所有的对接都基于沙盒环境,正式环境需要和支付宝进行签约。

发起支付

由用户提交付款信息,包括金额,用户订单号,商品名称,订单描述等信息。

付款流程

扫码付款。

后端通知

付款成功后支付平台会向后台发送一个异步的消息通知,系统在接收该信息时才对订单做出状态的更改,比如说更改会员状态,修改订单信息等操作。

1.下载资料。https://opendocs.alipay.com/open/270/106291/(所有的支付宝代码Demo都可以在这里找到)

2.下载秘钥生成工具:https://opendocs.alipay.com/open/291/106097/

 3.进入沙箱页面https://openhome.alipay.com/platform/appDaily.htm?tab=info

把工具生成的秘钥填进去

准备工作已经做完了开始写代码:

把下载资料里面的jar包导入项目:

然后写一个AlipayConfig:

把应用ID、商户私钥、支付宝公钥、已经支付宝网关修改成沙箱环境下的参数。

正式环境需要把应用ID、商户私钥、支付宝公钥、已经支付宝网关修改成正式环境下的参数。

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:8080/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";

    // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    public static String return_url = "http://127.0.0.1:8080/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";

    // 签名方式
    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:\\";


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

    /**
     * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
     * @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();
                }
            }
        }
    }
}

然后写一个调用接口,不需要修改什么地方,直接复制粘贴就行。
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.baizhi.config.AlipayConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@RestController
@RequestMapping("/pay")
@CrossOrigin
@Slf4j
public class payController {


    @RequestMapping("/index")
    public String index() {
        return "index";
    }
    @RequestMapping("/gopay")
    public void pay(HttpServletRequest request, HttpServletResponse resp) throws Exception {

        // 获得初始化的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("ISO-8859-1"), "UTF-8");
        // 付款金额,必填
        String total_amount = new String(request.getParameter("WIDtotal_amount").getBytes("ISO-8859-1"), "UTF-8");
        // 订单名称,必填
        String subject = new String(request.getParameter("WIDsubject").getBytes("ISO-8859-1"), "UTF-8");
        // 商品描述,可空
        String body = new String(request.getParameter("WIDbody").getBytes("ISO-8859-1"), "UTF-8");

        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 head = "<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8'></head>";

        String result = alipayClient.pageExecute(alipayRequest).getBody();

        String buttom = "<body></body></html>";
        // 输出
        resp.getWriter().println(head + result + buttom);
    }
}

然后写一个html前端

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
    <title>支付宝电脑网站支付</title>

</head>
<body text='#000000' bgColor='#ffffff' leftMargin='0' topMargin='4'>
<header class='am-header'>
    <h1>支付宝电脑网站支付体验入口页</h1>
</header>
<div id='main'>
    <form name='alipayment' action='pay/gopay' method='post' target='_blank'>
        <div id='body1' class='show' name='divcontent'>
            <dl class='content'>
                <dt>商户订单号 :</dt>
                <dd>
                    <input id='WIDout_trade_no' name='WIDout_trade_no' />
                </dd>
                <hr class='one_line' />
                <dt>订单名称 :</dt>
                <dd>
                    <input id='WIDsubject' name='WIDsubject' />
                </dd>
                <hr class='one_line' />
                <dt>付款金额 :</dt>
                <dd>
                    <input id='WIDtotal_amount' name='WIDtotal_amount' />
                </dd>
                <hr class='one_line' />
                <dt>商品描述:</dt>
                <dd>
                    <input id='WIDbody' name='WIDbody' />
                </dd>
                <hr class='one_line' />
                <dt></dt>
                <dd id='btn-dd'>
						<span class='new-btn-login-sp'>
							<button class='new-btn-login' type='submit'
                                    style='text-align: center;'>付 款</button>
						</span> <span class='note-help'>如果您点击“付款”按钮,即表示您同意该次的执行操作。</span>
                </dd>
            </dl>
        </div>
    </form>
    <div id='foot'>
        <ul class='foot-ul'>
            <li>支付宝版权所有 2015-2018 ALIPAY.COM</li>
        </ul>
    </div>
</div>
</body>
<script language='javascript'>
    function GetDateNow() {
        var vNow = new Date();
        var sNow = '';
        sNow += String(vNow.getFullYear());
        sNow += String(vNow.getMonth() + 1);
        sNow += String(vNow.getDate());
        sNow += String(vNow.getHours());
        sNow += String(vNow.getMinutes());
        sNow += String(vNow.getSeconds());
        sNow += String(vNow.getMilliseconds());
        document.getElementById('WIDout_trade_no').value = sNow;
        document.getElementById('WIDsubject').value = '测试';
        document.getElementById('WIDtotal_amount').value = '0.01';
    }
    GetDateNow();
</script>
</html>

点击付款界面,就可以调出支付的支付界面。

然后就是回调信息之类的。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:设计师小姐姐 返回首页