精华内容
下载资源
问答
  • 支付宝沙箱支付前后分离
  • 支付宝沙箱支付

    万次阅读 2020-05-15 14:52:40
    新建支付宝一个沙箱支付应用 https://openhome.alipay.com/platform/appDaily.htm?tab=info (沙箱环境地址) 点击上面的网址,我们会进入支付宝沙箱页面,首次使用支付宝沙箱,要进行一些配置,如图: 打开下载好...

    新建支付宝一个沙箱支付应用 https://openhome.alipay.com/platform/appDaily.htm?tab=info (沙箱环境地址)

    点击上面的网址,我们会进入支付宝沙箱页面,首次使用支付宝沙箱,要进行一些配置,如图:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    打开下载好的 支付宝开放平台开发助手 (上图下载的软件)
    在这里插入图片描述

    将生成好的,公钥配置到 支付宝沙箱上即可

    官方文档:https://openhome.alipay.com/developmentDocument.htm 查看电脑网站支付相关说明

    最新版支付宝算法的改变就是RSA升级了RSA2,长度推荐2048

    在Django中集成支付接口的前置操作就是需要安装pycryptodome

    安装库依赖

    pip3 install pycryptodome
    

    注意,如果报Crypto not found,则需要在python安装目录将crypto改成大写Crypto

    代码实例

    将之前生成好的私钥和公钥(注意这里的公钥是指支付宝公钥(alipay_public_2048.txt),私钥为用户的私钥(app_private_2048.txt)),放入到项目目录(keys)中去;

    在这里插入图片描述

    文档地址:https://docs.open.alipay.com/api

    然后根据支付宝官网文档写一个支付基类 pay.py
    在这里插入图片描述

    from datetime import datetime
    from Crypto.PublicKey import RSA
    from Crypto.Signature import PKCS1_v1_5
    from Crypto.Hash import SHA256
    from urllib.parse import quote_plus
    from urllib.parse import urlparse, parse_qs
    from base64 import decodebytes, encodebytes
    import json
    
    class AliPay(object):
        """
        支付宝支付接口(PC端支付接口)
        """
    
        def __init__(self, appid, app_notify_url, app_private_key_path,
                     alipay_public_key_path, return_url, debug=False):
            self.appid = appid
            self.app_notify_url = app_notify_url
            self.app_private_key_path = app_private_key_path
            self.app_private_key = None
            self.return_url = return_url
            with open(self.app_private_key_path) as fp:
                self.app_private_key = RSA.importKey(fp.read())
            self.alipay_public_key_path = alipay_public_key_path
            with open(self.alipay_public_key_path) as fp:
                self.alipay_public_key = RSA.importKey(fp.read())
    
            if debug is True:
                self.__gateway = "https://openapi.alipaydev.com/gateway.do"
            else:
                self.__gateway = "https://openapi.alipay.com/gateway.do"
    
        def direct_pay(self, subject, out_trade_no, total_amount, return_url=None, **kwargs):
            biz_content = {
                "subject": subject,
                "out_trade_no": out_trade_no,
                "total_amount": total_amount,
                "product_code": "FAST_INSTANT_TRADE_PAY",
                # "qr_pay_mode":4
            }
    
            biz_content.update(kwargs)
            data = self.build_body("alipay.trade.page.pay", biz_content, self.return_url)
            return self.sign_data(data)
    
        def build_body(self, method, biz_content, return_url=None):
            data = {
                "app_id": self.appid,
                "method": method,
                "charset": "utf-8",
                "sign_type": "RSA2",
                "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
                "version": "1.0",
                "biz_content": biz_content
            }
    
            if return_url is not None:
                data["notify_url"] = self.app_notify_url
                data["return_url"] = self.return_url
    
            return data
    
        def sign_data(self, data):
            data.pop("sign", None)
            # 排序后的字符串
            unsigned_items = self.ordered_data(data)
            unsigned_string = "&".join("{0}={1}".format(k, v) for k, v in unsigned_items)
            sign = self.sign(unsigned_string.encode("utf-8"))
            # ordered_items = self.ordered_data(data)
            quoted_string = "&".join("{0}={1}".format(k, quote_plus(v)) for k, v in unsigned_items)
    
            # 获得最终的订单信息字符串
            signed_string = quoted_string + "&sign=" + quote_plus(sign)
            return signed_string
    
        def ordered_data(self, data):
            complex_keys = []
            for key, value in data.items():
                if isinstance(value, dict):
                    complex_keys.append(key)
    
            # 将字典类型的数据dump出来
            for key in complex_keys:
                data[key] = json.dumps(data[key], separators=(',', ':'))
    
            return sorted([(k, v) for k, v in data.items()])
    
        def sign(self, unsigned_string):
            # 开始计算签名
            key = self.app_private_key
            signer = PKCS1_v1_5.new(key)
            signature = signer.sign(SHA256.new(unsigned_string))
            # base64 编码,转换为unicode表示并移除回车
            sign = encodebytes(signature).decode("utf8").replace("n", "")
            return sign
    
        def _verify(self, raw_content, signature):
            # 开始计算签名
            key = self.alipay_public_key
            signer = PKCS1_v1_5.new(key)
            digest = SHA256.new()
            digest.update(raw_content.encode("utf8"))
            if signer.verify(digest, decodebytes(signature.encode("utf8"))):
                return True
            return False
    
        def verify(self, data, signature):
            if "sign_type" in data:
                sign_type = data.pop("sign_type")
            # 排序后的字符串
            unsigned_items = self.ordered_data(data)
            message = "&".join(u"{}={}".format(k, v) for k, v in unsigned_items)
            return self._verify(message, signature)
    

    最后在视图文件中定义

    # 导入支付基类
    from mydjango_test2.pay import AliPay
    
    # 支付宝初始化 设置支付宝公私钥 
    # 用户私钥
    app_private_key_string = os.path.join(BASE_DIR, "keys/app_private_2048.txt")
    # 支付宝公钥
    alipay_public_key_string = os.path.join(BASE_DIR, "keys/alipay_public_2048.txt")
    
    
    # 初始化阿里支付对象
    def get_ali_object():
        app_id = '2016102400753318' #  APPID (沙箱应用)
        # 回调网址  支付完成后,跳转的地址。
        return_url = 'http://localhost:8000/ali_back/'
        # 实例化对象
        alipay = AliPay(
            appid=app_id,
            app_notify_url=return_url,
            return_url=return_url,
            # 私钥地址
            app_private_key_path=app_private_key_string,
            # 公钥地址
            alipay_public_key_path=alipay_public_key_string,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥
            # 默认False
            debug=True
        )
        return alipay
    
    
    # 支付网址视图
    def ali_pay(request):
        price = request.GET.get('price')
        orderid = request.GET.get('orderid')
        # 获取实例
        alipay = get_ali_object()
        query_params = alipay.direct_pay(
            subject='test',  # 商品简单描述
            out_trade_no=orderid,
            total_amount=price  # 交易金额(单位: 元 保留俩位小数)
        )
        # 拼接网址
        pay_url = "https://openapi.alipaydev.com/gateway.do?{0}".format(query_params)  # 支付宝网关地址(沙箱应用)
        return redirect(pay_url)
    
    
    # 定义回调方法
    def ali_back(request):
        # 接收参数 订单号
        orderid = request.GET.get('out_trade_no')
        # 修改订单状态
        orders = Orders.objects.get(orderid=orderid)
        orders.state = 1
        orders.save()
        # 重定向回到订单列表页
        return redirect("http://localhost:8080/order")
    

    如此,支付宝支付功能就完成了

    展开全文
  • 支付宝支付easysdk支付宝沙箱支付demo 1、支付宝支付文档地址 https://opendocs.alipay.com/apis/00y8k9 <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-...

    java支付宝支付easysdk支付宝沙箱支付demo


    总结

    1、下载密钥工具生成应用公钥、应用私钥

    应用私钥放代码里 merPrivateKey
    应用公钥放沙箱保存得到支付宝公钥->支付宝公钥也是放代码里 alipayPublicKey

    2、异步回调地址需要公网地址,可以下载内网穿透工具natapp、花生壳等

    https://natapp.cn/

    一、支付宝支付文档地址

    https://opendocs.alipay.com/apis/00y8k9

    在这里插入图片描述

    二、开发前的准备

    1.沙箱支付需要的配置情况

    alipay:
      appId: "2021000116662953"                     #沙箱的appid
      merPrivateKey: "MIIEvAIBADxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=" #商家应用私钥
      alipayPublicKey: "MIIBIjANBgxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"  #支付宝公钥
      gateway: "openapi.alipaydev.com"   #沙箱网关固定
      notifyUrl: "http://edrutb.natappfree.cc/alipay/notify"  #异步通知回调,用于用户支付成功后,支付宝调用的接口,会给我们返回订单的支付情况,以此修改我们的订单状态,或积分等等
      returnUrl: "http://edrutb.natappfree.cc/return_url.html" #这个地址配置是用来前端支付成功后的跳转地址
      errorUrl: "http://localhost:8720/error_url.html"  
    

    在这里插入图片描述回调接口如下:可在这里进行业务逻辑处理,支付状态的改变,积分等等

        /**
         * @param request: 请求
         * @return java.lang.String
         * @description: 支付宝异步回调
         */
        @PostMapping("/notify")
        public String notify(HttpServletRequest request) throws Exception {
            log.info("=========支付宝异步回调========");
            if ("TRADE_SUCCESS".equals(request.getParameter("trade_status"))) {
                Map<String, String> params = new HashMap<>();
                Map<String, String[]> requestParams = request.getParameterMap();
                for (String name : requestParams.keySet()) {
                    params.put(name, request.getParameter(name));
                    log.info(name + " = " + request.getParameter(name));
                }
                // 支付宝验签
                if (Factory.Payment.Common().verifyNotify(params)) {
                    log.info("交易名称: " + params.get("subject"));
                    log.info("交易状态: " + params.get("trade_status"));
                    log.info("支付宝交易凭证号: " + params.get("trade_no"));
                    log.info("商户订单号: " + params.get("out_trade_no"));
                    log.info("交易金额: " + params.get("total_amount"));
                    log.info("买家在支付宝唯一id: " + params.get("buyer_id"));
                    log.info("买家付款时间: " + params.get("gmt_payment"));
                    log.info("买家付款金额: " + params.get("buyer_pay_amount"));
                }
                return "success";
            }
            return "failed";
        }
    
    

    2.沙箱找appid

    在这里插入图片描述在这里插入图片描述如上找到appid
    appId: “2021000116662953” #沙箱的appid

    3.应用私钥、支付宝公钥

    merPrivateKey: “MIIEvAIBADxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=” #商家应用私钥
    alipayPublicKey: “MIIBIjANBgkqhkiG9xxxxxxxxxxxxxxxxxxxxxxxxxxxB” #支付宝公钥
    在这里插入图片描述在这里插入图片描述下载密钥工具https://ideservice.alipay.com/ide/getPluginUrl.htm?clientType=assistant&platform=win&channelType=WEB
    在这里插入图片描述在这里插入图片描述保存后得到支付宝公钥
    在这里插入图片描述

    3.内网穿透NATAPP下载(供异步通知等用)

    notifyUrl: “http://edrutb.natappfree.cc/alipay/notify”
    natapp官网: https://natapp.cn/
    注册实名后搞个免费隧道,注意设置端口号要与springboot程序启动的一致,或者用nginx监听转发
    在这里插入图片描述在这里插入图片描述客户端下载后,在用一目录搞个config.ini配置文件,把上面复制的token放上去
    在这里插入图片描述

    #将本文件放置于natapp同级目录 程序将读取 [default] 段
    #在命令行参数模式如 natapp -authtoken=xxx 等相同参数将会覆盖掉此配置
    #命令行参数 -config= 可以指定任意config.ini文件
    [default]
    authtoken=                    #对应一条隧道的authtoken
    clienttoken=                    #对应客户端的clienttoken,将会忽略authtoken,若无请留空,
    log=none                        #log 日志文件,可指定本地文件, none=不做记录,stdout=直接屏幕输出 ,默认为none
    loglevel=ERROR                  #日志等级 DEBUG, INFO, WARNING, ERROR 默认为 DEBUG
    http_proxy=                     #代理设置  非代理上网用户请务必留空
    

    双击exe运行得到对应的公网域名,放入代码的配置文件即可

    三 、Java完整代码如下

    1.Maven依赖

    			<dependency>
                    <groupId>com.alipay.sdk</groupId>
                    <artifactId>alipay-easysdk</artifactId>
                    <version>2.1.0</version>
                </dependency>
    

    2.工程目录

    在这里插入图片描述

    3.AlipayConfig

    alipay:
      appId: "2021000116662953"
      merPrivateKey: "MIIEvgIxxxxxxxxxxxxxxxxxxx"
      alipayPublicKey: "MIIBIjANBgxxxxxxxxxxxxxxxxxxxxxxx"
      gateway: "openapi.alipaydev.com"
      notifyUrl: "http://edrutb.natappfree.cc/alipay/notify"
      returnUrl: "http://localhost:8720/return_url.html"
      errorUrl: "http://localhost:8720/error_url.html"
    
    /**
     * @author kamu
     * @date 2020-12-09 15:38
     */
    @Log4j2
    @Component
    public class AlipayConfig implements ApplicationRunner {
    
        @Value("${alipay.appId}")
        private String appId;
    
        @Value("${alipay.merPrivateKey}")
        private String privateKey;
    
        @Value("${alipay.alipayPublicKey}")
        private String publicKey;
    
        @Value("${alipay.gateway}")
        private String gateway;
    
        @Value("${alipay.notifyUrl}")
        private String notifyUrl;
    
        @Override
        public void run(ApplicationArguments args){
            Factory.setOptions(getOptions());
            log.warn("==================================支付宝SDK初始化完成");
        }
    
        private Config getOptions() {
            Config config = new Config();
            config.protocol = "https";
            config.gatewayHost = this.gateway;
            config.signType = "RSA2";
            config.appId = this.appId;
            config.merchantPrivateKey = this.privateKey;
            config.alipayPublicKey = this.publicKey;
            config.notifyUrl = notifyUrl;
            return config;
        }
    
    }
    

    4.controller

    /**
     * @author kamu
     * @date 2020-12-08 15:26
     */
    @Log4j2
    @Api(tags = "alipay")
    @RestController
    @RequestMapping("/alipay")
    public class AliPayController {
    
        private AliPayService alipayService;
    
        @Autowired
        public void AlipayController(AliPayService alipayService) {
            this.alipayService = alipayService;
        }
    
        /**
         * app支付
         */
        @PostMapping("/app")
        public String app() {
            String subject = "测试支付";
            String total = "0.03";
            return alipayService.app(subject, total);
        }
    
        /**
         * 支付宝电脑网页支付
         */
        @PostMapping("/page")
        public String page() {
            String subject = "page";
            String total = "0.02";
            return alipayService.page(subject, total);
        }
    
        /**
         * 支付宝手机网页支付
         */
        @PostMapping("/wap")
        public String wap() {
            String subject = "wap";
            String total = "0.01";
            return alipayService.wap(subject, total);
        }
    
        /**
         * 查询交易
         */
        @GetMapping("/getTrade/{outTradeNo}")
        public String getTrade(@PathVariable String outTradeNo) {
            return alipayService.getTrade(outTradeNo);
        }
    
        /**
         * 支付宝异步回调
         */
        @PostMapping("/notify")
        public String notify(HttpServletRequest request) throws Exception {
            log.info("=========支付宝异步回调========");
            if ("TRADE_SUCCESS".equals(request.getParameter("trade_status"))) {
                Map<String, String> params = new HashMap<>();
                Map<String, String[]> requestParams = request.getParameterMap();
                for (String name : requestParams.keySet()) {
                    params.put(name, request.getParameter(name));
                    log.info(name + " = " + request.getParameter(name));
                }
                // 支付宝验签
                if (Factory.Payment.Common().verifyNotify(params)) {
                    log.info("交易名称: " + params.get("subject"));
                    log.info("交易状态: " + params.get("trade_status"));
                    log.info("支付宝交易凭证号: " + params.get("trade_no"));
                    log.info("商户订单号: " + params.get("out_trade_no"));
                    log.info("交易金额: " + params.get("total_amount"));
                    log.info("买家在支付宝唯一id: " + params.get("buyer_id"));
                    log.info("买家付款时间: " + params.get("gmt_payment"));
                    log.info("买家付款金额: " + params.get("buyer_pay_amount"));
                }
                return "success";
            }
            return "failed";
        }
    
        /**
         * 支付宝退款
         */
        @PostMapping("/refund")
        public String refund(String outTradeNo, String refundAmount) {
            return alipayService.refund(outTradeNo, refundAmount);
        }
    
        /**
         * 下载账单
         */
        @PostMapping("/downloadBill")
        public String downloadBill(String billType, String billDate) {
            billType = "trade";
            billDate = "2020-11";
            return alipayService.downloadBill(billType, billDate);
        }
    
    }
    

    5.service

    
    /**
     * @author kamu
     * @date 2020-12-09 14:36
     */
    public interface AliPayService {
    
        /**
         *  支付宝电脑网页支付
         */
        String page(String subject, String total);
    
        /**
         *  支付宝手机网页支付
         */
        String wap(String subject, String total);
    
        /**
         * 支付宝退款
         */
        String refund(String outTradeNo, String refundAmount);
    
        /**
         * app支付
         */
        String app(String subject, String total);
    
        String getTrade(String outTradeNo);
    
        String downloadBill(String billType, String billDate);
    }
    

    6.serviceImpl

    /**
     * @author kamu
     * @date 2020-12-09 14:37
     */
    @Log4j2
    @Service
    public class AliPayServiceImpl implements AliPayService {
    
        // 支付成功后要跳转的页面
        @Value("${alipay.returnUrl}")
        private String returnUrl;
    
        @Value("${alipay.errorUrl}")
        private String errorUrl;
    
        @Override
        public String page(String subject, String total) {
            try {
                String orderId = getOrderId();
                AlipayTradePagePayResponse response = Factory.Payment
                        // 选择电脑网站
                        .Page()
                        // 调用支付方法(订单名称, 商家订单号, 金额, 成功页面)
                        .pay(subject + orderId, orderId, total, returnUrl);
    
                return response.body;
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return null;
        }
    
        @Override
        public String wap(String subject, String total) {
            try {
                String orderId = getOrderId();
                AlipayTradeWapPayResponse response = Factory.Payment
                        //选择手机网站
                        .Wap()
                        // 调用支付方法(订单名称, 商家订单号, 金额, 中途退出页面, 成功页面)
                        .pay(subject + orderId, orderId, total, errorUrl, returnUrl);
    
                return response.body;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return "付款失败";
        }
    
        @Override
        public String refund(String outTradeNo, String refundAmount) {
            try {
                AlipayTradeRefundResponse response = Factory.Payment
                        .Common()
                        // 调用交易退款(商家订单号, 退款金额)
                        .refund(outTradeNo, refundAmount);
                if ("Success".equals(response.getMsg())) {
                    return "退款成功";
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return "退款失败";
        }
    
        @Override
        public String app(String subject, String total) {
            try {
                AlipayTradeAppPayResponse response = Factory.Payment.App().pay(subject, getOrderId(), total);
                return response.body;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        @Override
        public String getTrade(String outTradeNo) {
            AlipayTradeQueryResponse query = null;
            try {
                query = Factory.Payment.Common().query(outTradeNo);
                String httpBody = query.getHttpBody();
                if ("10000".equals(query.getCode()))
                    return httpBody;
                else
                    return query.getMsg() + query.getSubMsg();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return "failed";
        }
    
        @Override
        public String downloadBill(String billType, String billDate) {
            return "";
        }
    
        public String getOrderId() {
            String idStr = IdWorker.getIdStr().substring(15);
            log.info("========================  " + idStr);
            return idStr;
        }
    }
    

    最后丢个前端页面

    在这里插入图片描述
    引用的js文件自己搞,上传不了

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>测试支付</title>
        <script src="./js/vue.min.js"></script>
        <script src="./js/axios.min.js"></script>
        <script src="./js/vue-resource.min.js"></script>
        <!-- 引入样式 -->
        <link rel="stylesheet" href="https://unpkg.com/element-ui@2.14.0/lib/theme-chalk/index.css">
        <!-- 引入组件库 -->
        <script src="https://unpkg.com/element-ui@2.14.0/lib/index.js"></script>
        <script src="https://cdn.staticfile.org/jquery/3.4.0/jquery.min.js"></script>
        <script src="https://cdn.staticfile.org/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>
        <link rel="stylesheet" href="./css/bootstrap.min.css">
        <link rel="stylesheet" href="./css/style.css">
    </head>
    <body>
    <div id="app">
        <h2>测试支付</h2>
    
        <form enctype="multipart/form-data" action="/alipay/page" method="post">
            <button type="submit">电脑确认支付</button>
        </form>
        <form enctype="multipart/form-data" action="/alipay/wap" method="post">
            <button type="submit">手机确认支付</button>
        </form>
        <form enctype="multipart/form-data" action="/alipay/app" method="post">
            <button type="submit">app确认支付</button>
        </form>
    
        <el-button type="primary" @click="downloadBill">账单</el-button>
    
        <!--搜索条 start-->
        <div class="searchBar">
            <div class="form-group">
                <label>单号:</label>
                <label>
                    <input type="text" class="form-control" v-model="outTradeNo"
                           placeholder="单号">
                </label>
            </div>
            <el-button type="primary" @click="filterBtn">交易查询</el-button>
            <el-button type="info" @click="clearSearch">重 置</el-button>
        </div>
        <!--搜索条 end-->
    
        <div class="orderInfo">
            <dl class="dl-horizontal">
                <dt>buyer_logon_id</dt>
                <dd>{{orderList.buyer_logon_id}}</dd>
            </dl>
            <dl class="dl-horizontal">
                <dt>buyer_pay_amount</dt>
                <dd>{{orderList.total_amount}}</dd>
            </dl>
            <dl class="dl-horizontal">
                <dt>buyer_user_id</dt>
                <dd>{{orderList.buyer_user_id}}</dd>
            </dl>
            <dl class="dl-horizontal">
                <dt>out_trade_no</dt>
                <dd>{{orderList.out_trade_no}}</dd>
            </dl>
            <dl class="dl-horizontal">
                <dt>trade_no</dt>
                <dd>{{orderList.trade_no}}</dd>
            </dl>
            <dl class="dl-horizontal">
                <dt>trade_status</dt>
                <dd>{{orderList.trade_status}}</dd>
            </dl>
        </div>
    
        <!-- <div class="cantainer">
             <el-table style="width: 100%;"
                       :data="orderList"
                       :row-class-name="tableRowClassName"
                       :header-cell-style="{background:'#eef1f6',color:'#606266'}"
             >
                 <el-table-column label="buyer_logon_id" prop="buyer_logon_id" width="200">
                 </el-table-column>
                 <el-table-column label="buyer_pay_amount" prop="buyer_pay_amount" width="200">
                 </el-table-column>
                 <el-table-column label="buyer_user_id" prop="buyer_user_id" width="200">
                 </el-table-column>
                 <el-table-column label="out_trade_no" prop="out_trade_no" width="200">
                 </el-table-column>
                 <el-table-column label="total_amount" prop="total_amount" width="200">
                 </el-table-column>
                 <el-table-column label="trade_no" prop="trade_no" width="200">
                 </el-table-column>
                 <el-table-column label="trade_status" prop="trade_status" width="200">
                 </el-table-column>
                          <el-table-column label="操作">
                                 <template slot-scope="scope">
                                     <el-popover
                                             placement="right"
                                             width="100%"
                                             trigger="click">
                                         <el-table :data="orderLotList" :row-class-name="tableOrderLotList"
                                                   :header-cell-style="{background:'#eef1f6',color:'#606266'}"
                                                   :row-style="{background:'#eef1f6',color:'#606266'}"
                                         >
                                             <el-table-column width="160" property="productionTime"
                                                              label="生产日期"></el-table-column>
                                             <el-table-column width="160" property="lotNo" label="批次号"></el-table-column>
                                             <el-table-column width="160" property="expiredTime"
                                                              label="有效期"></el-table-column>
                                             <el-table-column width="160" property="qty" label="数量"></el-table-column>
                                             <el-table-column width="160" property="price" label="单价"></el-table-column>
                                             <el-table-column width="160" property="purchasePrice"
                                                              label="采购价"></el-table-column>
                                         </el-table>
                                         <el-button type="primary" slot="reference" @click="getLotList(scope.row)">批号详情
                                         </el-button>
                                     </el-popover>
                                 </template>
                             </el-table-column>&ndash;&gt;
             </el-table>
                <el-pagination
                        background
                        @size-change="handleSizeChange"
                        @current-change="handleCurrentChange"
                        :current-page="searchBarParams.pageIndex"
                        :page-sizes="[10, 20, 50, 80, 100]"
                        :page-size="searchBarParams.pageSize"
                        layout="total, sizes, prev, pager, next, jumper"
                        :total="totalCount">
                </el-pagination>
         </div>-->
    </div>
    </body>
    <script type="text/javascript">
        window.onload = function () {
            var api = ''
            var app = new Vue({
                el: '#app',
                data: {
                    outTradeNo: '2',
                    orderList: [],//列表数据
                },
                methods: {
                    clearSearch() {
                        this.outTradeNo = '';
                    },
                    filterBtn() {
                        this.getorderList(this.outTradeNo)
                    },
                    getorderList(outTradeNo) {
                        axios({
                            method: 'get',
                            url: '/alipay/getTrade/'+outTradeNo
                        }).then(res => {
                            console.log(res)
                            this.orderList = res.data.alipay_trade_query_response
                            console.log("==========================")
                            console.log(this.orderList)
                            console.log("==========================")
                        }).catch(error => {
                            console.log('请求失败 ', error)
                        })
                    },
                    tableRowClassName({row, rowIndex}) {
                        if (rowIndex % 2 === 0) {
                            return 'warning-row';
                        } else if (rowIndex % 2 === 1) {
                            return 'success-row';
                        }
                        return '';
                    },
                    downloadBill() {
                        axios({
                            method: 'post',
                            url: '/alipay/downloadBill',
                            data: {billType: 'billType', billDate: 'billDate'}
                        }).then(res => {
                            console.log(res)
                        }).catch(error => {
                            console.log('请求失败 ', error)
                        })
                    }
                },
                created() {
                    // this.getorderList(this.outTradeNo)
                }
            })
        }
    </script>
    </html>
    
    
    展开全文
  • 主要为大家详细介绍了SpringBoot集成支付宝沙箱支付,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 支付宝沙箱支付步骤

    2021-05-17 21:53:09
    文档中心——网页移动应用——开放能力——支付能力——电脑网站支付 下载SDK&Demo 调试Demo 文档中心——网页移动应用——开发工具——沙箱环境 生成公钥和私钥,设置应用公钥 在Demo中添加APPID,应用私钥和...
    1. 蚂蚁金服开放平台
    2. 文档中心——网页移动应用——开放能力——支付能力——电脑网站支付
    3. 下载SDK&Demo
    4. 调试Demo
    5. 文档中心——网页移动应用——开发工具——沙箱环境
    6. 生成公钥和私钥,设置应用公钥
    7. 在Demo中添加APPID,应用私钥和支付宝公钥
    8. 支付宝网关

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 支付宝沙箱支付实现

    2020-09-04 13:29:59
    准备好 支付宝开放平台开发助手 支付宝开放平台 申请自己的沙箱环境 花生壳 内网穿透工具 6元 98年 实名认证 客户端调试工具 手机安装

    准备好

    1. 支付宝开放平台开发助手
    2. 支付宝开放平台 申请自己的沙箱环境
    3. 花生壳 内网穿透工具 6元 98年 实名认证
    4. 客户端调试工具 手机安装
      在这里插入图片描述
      去官网登录点击研发服务

    在这里插入图片描述
    在支付宝开放平台开发助手获取密钥并输入
    在这里插入图片描述
    java代码:id 密钥,公钥,url我都改了 大家根据自己的填写就可以了

    public class AliPayController {
        /**
         * appID
         */
        public  final static String APP_ID="20210001186681";
        /**
         * 应用密钥
         */
        public  final static String APP_PRIVATE_KEY="MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCFDZl1fml/LfBDIunLp469QA3wBIHF2CRE3smYGoGeqbHtnwqweFqsbgQtTK4Cns3W6FM+iM/pYgIUt+NMGhZ/UGevw/x4psP1UjFc8VqIw5MU0zaEsgR6IAMRuIwWSIH4wCNRhKXTGdT285PaQn1iPoaJQNsFLpmpobt49fEsHXWHyPc9E16dwy0W4icGmveZCcJB5BHRAg9AqokvUVed3YMWi7F+HMqV4hHzaMuLrgMDGkY7++YwR2hxb8TevfBCh4ESyktijK91n+ihkTmrvU2L/oeMfK51D4iB1YOR18zSpwP3adl0NeJWNP4Rv0cTsxNoVJCJr3oyDrOzzg4zAgMBAAECggEAXYHDOamPpsu4MNaWjIPDcwlTQj1InqxaQPR5pSXrtn/4BdFiB8dtogTndpaPLFRCwSghaK9pvtEcOUdKvK8Q5ISzefk4s+oviXcsLe+I+tjHwzj09ajOMK3Sul+CRB7NCO6vY5jfmU5sNunUHO3hhGwAzPEBe9DWOTrqsAXYanF901Sb7ZgGBGdUEYDPLCbrwWmrqsKorIFNvKxavhQS0jQ8FFn4zEW797/7cGvHMIQLB1hE/wcPaktclmZVvaOlMOF1Wm+pCZfanPOKLkGUzd1ywCwyd7KgQa7o4z/vLHSPZl4aYMOIU5T98DaQ5pCBJpYT0FjaF2lBCI6l28mRwQKBgQDDdlQ7resLMh9odtKCr6fTw5/Z3VfHVTKHWBqiSGm4+Sn5+OjzEUYoFCY7gUSXTejGuzEuNdvtHESA0H1Cc+5ynfIbQIuR678gDtwPfRoa20ebShP7VfTwdPZIIGI1VvoJI3YoXD1plzN/9Y9NHm0S/Al2lwQ+5Kss3BQ/H1+5sQKBgQCuQwWM5C/xWVtaZGIfPMf8jrdqpDW93Zc/Q0WGdvJgGdFqOykftB0qySsKKxbxwJqVlR4x8LEvLJuPycAj4iM3DPxBtGF0gICtiJdo20xiCdGuZvZCx03tCxjv4sNdGf8adDW72lOSYnzpgIPkH8pDK92I/qSOhEKm0B2/acIbIwKBgFBIO9S/XHkevzPDCjfPOhmKkg+EEFe5MKXSlC3vnCzzekBH8jZT9ALmM8XhFHEo+OEXZd3bFVfQcnqOJ8SxpVDCevyiiDEJKVlbgRuDgMNjKYgo5wgmiBJzl+yMEIpkDRLP0+pD6J2EEw0NqSw9wQM5LhHdeUrz1TL5uf8rPcAhAoGADjLv1NcTAPti8i6TwC/Xq8CFOW8/4cSYelMk6xvuC96OrbU8WJT4e3AAzcdNC03CSsXnu/H8vfdIhaLOwR2/+NBaDZCBEFkYIwuqKqUTyDk8mJVTI4XR16q70XAMsx1XJ/SoHDJh9N+Jhg0usfvVIzwDxRHanrIwLB9xDRO0+TkCgYB/KmhJE9mSVic4OZqm+qxSvV/PaQ6cz/+j0d+f8O4tIcnyHIICKSU5uY6LEJRCXaz+fKwJgD4D8EE66WjX0Yjuv8zJ4/GRsLaX5RC1/o";
        /**
         * 编码
         */
        public  final static String CHARSET="utf-8";
        /**
         * 支付宝公钥
         */
        public  final static String ALIPAY_PUBLIC_KEY="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhQ2ZdX5pfy3wQyLpy6eOvUAN8ASBxdgkRN7JmBqBnqmx7Z8KsHharG4ELUyuAp7N1uhTPojP6WICFLfjTBoWf1Bnr8P8eKbD9VIxXPFaiMOTFNM2hLIEeiADEbiMFkiB+MAjUYSl0xnU9vOT2kJ9Yj6GiUDbBS6ZqaG7ePXxLB11h8j3PRNencMtFuInBpr3mQnCQeQR0QIPQKqJL1FXnd2DFouxfhzKleIR82jLi64DAxpGO/vmMEdocW/E3r3wQoeBEspLYoyvdZ/ooZE5q71Ni/B";
        /**
         *
         */
        public  final static String serverURL="https://openapi.alipay.com/gateway.do";
        /**
         *
         */
        public  final static String FORMAT="json";
        /**
         *
         */
        public  final static String SING_TYPE="RSA2";
    
    
        public  void getOrderInfo(){
            //实例化客户端
            AlipayClient alipayClient = new DefaultAlipayClient(serverURL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY,SING_TYPE );
    //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
            AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
    //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
            AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
            model.setBody("我是测试数据");
            model.setSubject("App支付测试Java");
            model.setOutTradeNo("158131415728");
            model.setTimeoutExpress("30m");
            model.setTotalAmount("0.01");
            model.setProductCode("QUICK_MSECURITY_PAY");
            request.setBizModel(model);
            request.setNotifyUrl("http://3wa3852747.qicp.vip");
            try {
                //这里和普通的接口调用不同,使用的是sdkExecute
                AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
                System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
            } catch (AlipayApiException e) {
                e.printStackTrace();
            }
        }
    @PostMapping("/notify")
        public String notify_url(HttpServletRequest request) {
        Map<String, String> params = new HashMap<String, String>();
        Map requestParams = request.getParameterMap();
        for (Iterator 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] + ",";
            }
            //乱码解决,这段代码在出现乱码时使用。
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            params.put(name, valueStr);
        }
    //切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
    //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
        try {
            boolean flag = AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, CHARSET, SING_TYPE);
            if (!flag) {
                System.out.println("success");
                return "success";
            } else {
                System.out.println("flag");
                return "flag";
            }
        } catch (AlipayApiException e) {
            e.printStackTrace();
            return "flag";
        }
    
    }
    
    
        public static void main(String[] args) {
            AliPayController apc=new AliPayController();
            apc.getOrderInfo();
        }
    }
    

    根据自己的修改就可以了,然后复制下面那一行 去手机端的客户端调试工具就可以了。
    在这里插入图片描述

    展开全文
  • 这篇文章可以参考 Springboot整合支付宝沙箱支付(支付和退款)
  • springboot实现支付宝沙箱支付功能

    千次阅读 2020-08-05 11:44:56
    springboot实现支付宝沙箱支付功能 一、支付宝测试开发环境前期准备 1.Java支付的demo 下载地址:https://docs.open.alipay.com/270/106291/ 2.解压并打开内容。大致的内容如下: import java.io.FileWriter; ...
  • 以下是支付宝沙箱的环境支付功能的效果图 新建一个MVC项目,代码结构如下: 第一步:新建项目
  • 在Java Web中使用支付宝沙箱支付 参考博客 https://blog.csdn.net/stormdony/article/details/83305651
  • Springboot整合支付宝沙箱支付

    千次阅读 2020-05-09 22:27:32
    springboot简简单单的整合支付宝沙箱支付。简单实现支付宝的扫码,最简单,最基础的。复制即可使用 先上效果图 最后一张图是验证成功后返回的数据。 上代码 // 应用ID,您的APPID,收款账号既是您的APPID对应...
  • 支付宝沙箱支付配置

    2020-09-22 13:09:38
    点这里进入支付宝开放平台 2.进入控制台,点击研发服务 3.选择windows或者mac版本的工具 点击这里下载生成私钥密钥 4.安装后,点击生成密钥: 点击页面中的打开密钥文件位置,就可以看到生成的公钥和私钥: 将...
  • 这篇博文讲解在SpringBoot中集成支付宝沙箱支付。 沙箱是一个测试环境,可以模拟真正在线上使用支付宝支付的效果,又不会对真实财产产生影响。 支付宝官方也为我们提供了一个支付小demo,我们先下载下来。 ...
  • 本次介绍支付宝沙箱支付
  • 在Java Web中使用支付宝沙箱支付

    千次阅读 热门讨论 2018-10-23 13:45:24
    支付宝沙箱功能,可以实现虚拟支付,适合拿来练手 下面就进入正题吧 进入沙箱 支付宝扫码登录蚂蚁金服开放平台之后,在首页的常用功能那里进入沙箱应用,如果是第一次使用,就需要添加功能。参考下图 生成...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,345
精华内容 1,738
关键字:

支付宝沙箱支付