自己个人拥有一个可以支付功能的网站?当然可以了!保姆级演示!

文章目录

*
前提条件
演示
应用申请开通和配置

+ 应用创建
+ 应用配置
代码开发

+ 后端实例
+ 前端代码实例
源码

前提条件

这是必要条件!!!
这是必要条件!!!
这是必要条件!!!
开通当面付, 个人、企业账号均可,个人账号可以私聊我帮忙代开通,10分钟就OK !!!

演示

获取订单点击,然后扫码支付

自己个人拥有一个可以支付功能的网站?当然可以了!保姆级演示!

支付成功后就会响应支付成功

自己个人拥有一个可以支付功能的网站?当然可以了!保姆级演示!

; 应用申请开通和配置

接下来介绍应用的创建和配置,一定要仔细哦!!!

应用创建

首先进入支付宝开放平台,进入控制台,创建一个应用,大概1个工作日内就会审核

自己个人拥有一个可以支付功能的网站?当然可以了!保姆级演示!

把这几个必填项填写,然后确认创建,注意名字要清晰,应用图标要有一定的可识别性,不然不给过,应用类型选网页应用

自己个人拥有一个可以支付功能的网站?当然可以了!保姆级演示!

; 应用配置

创建好后,进入产品详情页面,点击 产品绑定,然后 去绑定

自己个人拥有一个可以支付功能的网站?当然可以了!保姆级演示!

选择 支付 -> 当面付[勾选] -> 绑定,另外你还可以找到花呗支付,这样用户扫码时就支持花呗支付了

自己个人拥有一个可以支付功能的网站?当然可以了!保姆级演示!

要确认是开通状态哦,如果没有开通需要开通哦,看上面的 前提条件

自己个人拥有一个可以支付功能的网站?当然可以了!保姆级演示!

然后需要配置密钥,点击下图中侧边栏中的 开发设置,需要配置的是 接口加签方式(证书/密钥)

  • 接口加签方式(证书/密钥):配置支付宝开放平台会引导你下载安装密钥生成工具,生成一个应用公钥和应用私钥,私钥一定要保管好,不要泄露,保存到本地,到时候配置在服务器上,然后把应用公钥配置在开放平台上,就算配置完成了,支付宝就会给到你一个支付宝公钥,接下来你一共有三个密钥,支付宝公钥、应用公钥、应用私钥,这三个一定要分清,接下来文章介绍的所需要用到的密钥只有这三个,清一定要分清!!!

自己个人拥有一个可以支付功能的网站?当然可以了!保姆级演示!

代码开发

接下来你可以结合着官方的开发文档看我的文章,官方文档:https://opendocs.alipay.com/open/02ekfg?ref=api&scene=19

后端实例

SDK集成

首先获取相应的SDK,SDK下载页面(官方):https://opendocs.alipay.com/open/54/103419

我这里以Maven的方式集成,另外我集成了zxing,用于生成支付二维码使用


<dependency>
    <groupId>com.alipay.sdkgroupId>
    <artifactId>alipay-sdk-javaartifactId>
    <version>4.35.9.ALLversion>
dependency>

<dependency>
    <groupId>com.google.zxinggroupId>
    <artifactId>coreartifactId>
    <version>3.5.1version>
dependency>

Controller实例

  • 生成付款二维码,我标明了详细的注释,可以直接看!
  • 由于涉及到公钥、私钥等信息,这些部分我都用了 **来表示,
  • 记得替换哦!!!
  • 记得替换哦!!!
  • 记得替换哦!!!
  • 替换成你自己的!!!

以下为简单的Demo演示,一定要结合官方文档,阅读接入注意事项:https://opendocs.alipay.com/open/194/105322

package com.demo.pay;

import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePrecreateRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("pay")
public class AliPayController {

    private boolean userPayState = false;

    private static final String SERVER_URL = "https://openapi.alipay.com/gateway.do";

    private static final String CHARSET = "GBK";

    private static final String FORMAT = "json";

    private static final String SIGN_TYPE = "RSA2";

    private static final String APPID = "**************";

    private static final String APP_PRIVATE_KEY = "**************";

    private static final String ALIPAY_PUBLIC_KEY = "**************";

    @RequestMapping(value = "/getQr", produces = MediaType.IMAGE_JPEG_VALUE)
    @ResponseBody
    public byte[] getQr() {

        userPayState = false;

        AlipayClient alipayClient = new DefaultAlipayClient(SERVER_URL, APPID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);
        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();

        request.setNotifyUrl("http://**************.com/pay/payNotification");

        JSONObject bizContent = new JSONObject();

        String orderNumber = "pay" + System.currentTimeMillis();

        bizContent.put("out_trade_no", orderNumber);
        bizContent.put("total_amount", 0.01);
        bizContent.put("subject", "demo");
        request.setBizContent(bizContent.toString());

        try {
            AlipayTradePrecreateResponse response = alipayClient.execute(request);
            if (response.isSuccess()) {
                System.out.println("调用成功");
            } else {
                System.out.println("调用失败");
            }

            String qrCode = response.getQrCode();

            BufferedImage image = QrCodeUtil.createImage(qrCode);

            ByteArrayOutputStream out = new ByteArrayOutputStream();
            ImageIO.write(image, "jpeg", out);
            byte[] b = out.toByteArray();
            out.write(b);
            out.close();

            return b;
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("调用失败");
        }
        return null;
    }

    @PostMapping("payNotification")
    public String payNotification(HttpServletRequest request) {
        Map<String, String> params = new HashMap<>();
        Map<String, String[]> requestParams = request.getParameterMap();
        for (String name : requestParams.keySet()) {
            String[] values = 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);
        }

        for (Map.Entry<String, String> entry : params.entrySet()) {
            System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
        }

        try {

            boolean signVerified = AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, CHARSET, SIGN_TYPE);
            if (signVerified) {

                System.out.println("验签成功");

                String orderStatus = searchOrderStatus(params.get("out_trade_no"), params.get("trade_no"));
                switch (orderStatus) {
                    case "TRADE_SUCCESS"://交易支付成功;
                    case "TRADE_FINISHED":

                        userPayState = true;
                        break;
                }
                return "success";
            } else {

                System.out.println("验签失败");
                return "fail";
            }
        } catch (AlipayApiException e) {
            e.printStackTrace();
            return "fail";
        }
    }

    private String searchOrderStatus(String outTradeNo, String tradeNo) throws AlipayApiException {
        AlipayClient alipayClient = new DefaultAlipayClient(SERVER_URL, APPID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);
        AlipayTradeQueryRequest aliRequest = new AlipayTradeQueryRequest();
        JSONObject bizContent = new JSONObject();
        bizContent.put("out_trade_no", outTradeNo);
        bizContent.put("trade_no", tradeNo);
        aliRequest.setBizContent(bizContent.toString());
        AlipayTradeQueryResponse response = alipayClient.execute(aliRequest);
        JSONObject responseObject = JSONObject.parseObject(response.getBody());
        JSONObject alipayTradeQueryResponse = responseObject.getJSONObject("alipay_trade_query_response");
        return alipayTradeQueryResponse.getString("trade_status");
    }

    @CrossOrigin
    @GetMapping("searchOrder")
    public OrderStateEntity searchOrder() {

        if (userPayState) {

            return new OrderStateEntity(200, "支付成功了");
        } else {

            return new OrderStateEntity(201, "你还没有支付哦");
        }
    }

    static class OrderStateEntity {
        private int code;
        private String msg;

        public OrderStateEntity(int code, String msg) {
            this.code = code;
            this.msg = msg;
        }

        public int getCode() {
            return code;
        }

        public void setCode(int code) {
            this.code = code;
        }

        public String getMsg() {
            return msg;
        }

        public void setMsg(String msg) {
            this.msg = msg;
        }
    }

}

用户支付后的回调

当使用setNotifyUrl后,用户成功支付后,会回调其设置的url,如 setNotifyUrl(“http://xxx.com/pay/payNotification”) ,那么支付宝会等待用户支付成功后会以POST去请求 http://xxx.com/pay/payNotification 这个地址来达成回调,需要响应success或者fail,只有这两种值哦!

响应值描述异步是否重试发送fail消息获取失败重试success消息获取成功不重试

前端代码实例

DOCTYPE html>
<html lang="en">
<head>
    <meta name="viewport" content="width=device-width,initial-scale=1" />
    <meta charset="UTF-8">
    <title>支付宝当面付Demo演示title>
    <style>
        * {
            margin: 0 auto;
        }
        .root {
            width: 260px;
        }
        .img_box {
            width: 260px;
            height: 260px;
            background-color: #adadad;
        }
        button {
            width: 260px;
            margin-top: 12px;
        }
    style>
head>
<body>
<div class="root">
    <div class="img_box"><img width="260" height="260" id="qr" src="" alt="">div>
    <button onclick="getOrderQr()">获取订单button>
    <div class="response" id="response">div>

    <script>

        function getOrderQr() {
            let qrImg = document.getElementById('qr');
            qrImg.src = "http://**************.com/pay/getQr?time=" + new Date().getTime()

            orderResponse()
        }

        let number = 1;
        const responseView = document.getElementById('response')

        function orderResponse() {

            setTimeout(function () {

                const xhr = new XMLHttpRequest();
                xhr.open('GET', "http://**************.com/pay/searchOrder", true);
                xhr.send(null);
                xhr.onreadystatechange = function () {
                    if (xhr.status === 200 && xhr.readyState === 4) {
                        const json = JSON.parse(xhr.responseText);
                        if (200 === json.code) {

                            responseView.innerText = xhr.responseText
                        } else {

                            responseView.innerText = '第' + number + '次查询,结果:' + xhr.responseText
                            number++
                            orderResponse()
                        }
                    }
                }
            }, 2000)
        }
    script>
div>
body>
html>

源码

Github:https://github.com/ThirdGoddess/aliPay

Original: https://blog.csdn.net/qq_40881680/article/details/128406119
Author: 第三女神程忆难
Title: 自己个人拥有一个可以支付功能的网站?当然可以了!保姆级演示!

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/804027/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球