Bootstrap

支付宝API支付使用文档--java《扫一扫支付》--demo但是封装高可用--改一改配置就拿走用!超详细!!有手就行!!!(上)修改官网配置类-spring+vue

阿丹:

        在项目中总会遇到支付宝支付的问题吧!!!咱们web程序员总要调用一次支付宝吧!!哈哈哈哈,本文章使用vue +  spring-boot来完成一个在沙箱的情况下完成的支付宝扫码支付,但是我会根据spring-boot的特性尽可能的保证高可用,实现改一改配置就拿走用。

进入官网--找到开发沙箱

Alipay

选择我标红的进入 

跳转这个页面 

从首页点击API,在下面找到我标记的沙箱 

我们要去下载准备两个东西/一个在电脑上的、一个手机上的

下载沙箱钱包

小程序文档 - 支付宝文档中心

跟随指引进入沙箱控制台

 

点击然后根据跳转的二维码,使用手机扫码进行下载安装就可以了

 手机端的沙箱版本登录进入,以及账号寻找登入 

阿丹:我在这里找了好一会就是登录不进来所以给大家避坑一下

1.下载好了正常安装

2.下载好了正常安装

在平台中进入沙箱账号找到自己的沙箱账号

 坑出现了!!!我看到的登录页面是这样的!!

问题是没有给我账号的手机号码啊!小问题跟着阿丹!!

 根据阿丹的指引!看到了吗!支付宝号,邮箱登录!!!

这里的买家账号就是使用的邮箱粘贴使用,密码是6个1,付款密码也是的!要记住!!然后就可以登录进来了!!!

 就进来了,默认的余额是一百万!!给阿丹点赞点关注了我反手就是一个沙箱一百万!听懂掌声!

 下载支付宝开放平台密钥工具

小程序文档 - 支付宝文档中心

我给链接拿出来了!! 

https://ideservice.alipay.com/ide/getPluginUrl.htm?clientType=assistant&platform=win&channelType=WEB

下载完了就安装就行!! 完事就是这样!!!

我们开始配置我们需要的公钥和私钥

首先获取到我们的公钥和私钥,进入软件使用指引的方式来获取

 复制我们生成的公钥

进入我们的沙箱平台 

 登录 - 支付宝

 点击设置并查看

将我们复制的公钥复制进入

 我们就获得到了应用的公钥和支付宝的公钥

就可以啦! 

准备工作就绪!!我们开始准备开发我们的扫一扫支付!!!!

 找到我们需要的依赖

因为我们使用的是maven项目

Maven Central: com.alipay.sdk:alipay-sdk-java

 调用扫一扫支付需要的maven依赖。

        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>4.38.76.ALL</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83_noneautotype</version>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>1.62</version>
        </dependency>
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>3.12.13</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

alipay-sdk-java: 我们调用支付宝支付功能的主要依赖
bcprov-jdk15on:提供加密算法

下载官方给我们准备的demo!java的demo 

 小程序文档 - 支付宝文档中心

 下载完毕解压出来的文件如下:

 我们来看看官网给我们的东西我们可以得到什么!!!

两个配置类!!其实我们可以使用的也就是这个了!!

这个配置类告诉了我们在开发的过程中,我们需要用到什么属性,在这里也说明了,但是这里一些配置如果在程序中写死了,那么可重用性质就不高了。

所以这个配置我们在代码中使用spring-boot的约定大于配置的写法使用配置中注入方式这样写:

配置类: 

package com.adn.common.utils;

import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.ConstructorBinding;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@Component
@Data
@ConfigurationProperties(prefix = "apputil")
public class AppUtil implements InitializingBean {
    // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
    private  String appid;

    // 商户私钥,您的PKCS8格式RSA2私钥
    private  String merchantprivatekey;

    // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。.
    private  String alipaypublickey;

    // 服务器异步通知页面路径
    //需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    private  String notifyurl;

    // 页面跳转同步通知页面路径
    //需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    private  String returnurl;

    // 签名方式
    private  String signtype;

    // 字符编码格式
    private  String charset;

    // 支付宝网关,注意这些使用的是沙箱的支付宝网关,与正常网关的区别是多了dev
    private  String gatewayurl;

    // 支付宝网关
    private  String logpath;


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

    /**
     * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
     * @param sWord 要写入日志里的文本内容
     */
    public void logResult(String sWord) {
        FileWriter writer = null;
        try {
            writer = new FileWriter(this.logpath + "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();
                }
            }
        }
    }

    @Override
    public void afterPropertiesSet() throws Exception {

    }
    /**
     * 验签,是否正确
     */
    public boolean checkSign(HttpServletRequest request) {
        Map<String, String[]> requestMap = request.getParameterMap();
        Map<String, String> paramsMap = new HashMap<>();
        requestMap.forEach((key, values) -> {
            String strs = "";
            for (String value : values) {
                strs = strs + value;
            }
            System.out.println(key + "===>" + strs);
            paramsMap.put(key, strs);
        });
        System.out.println();
        //调用SDK验证签名
        try {
            return AlipaySignature.rsaCheckV1(paramsMap, this.getAlipaypublickey(), this.getCharset(), this.getSigntype());
        } catch (AlipayApiException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("*********************验签失败********************");
            return false;
        }
    }
}

按照我的注释在配置文件yml中写上对应的配置 

#支付宝使用配置
pay:
  #应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
  app_id:
  #商户私钥,您的PKCS8格式RSA2私钥
  merchant_private_key:
  #支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥
  alipay_public_key:
  #服务器异步通知页面路径需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
  notify_url:
  #页面跳转同步通知页面路径需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
  return_url:
  #签名方式
  sign_type:
  #字符编码格式
  charset: utf-8
  #支付宝网关,注意这些使用的是沙箱的支付宝网关,与正常网关的区别是多了dev
  gatewayUrl: https://openapi-sandbox.dl.alipaydev.com/gateway.do
  #支付宝网关 日志书写地址
  log_path:

 

注意!!!!!!!

如果发现读取不到、以及报错数据那么就使用双引号括起来!!!

notify_url和return_url可以先不用写在下面开发完毕在写就可以!

这样写的好处是方便开发如果在微服务的架构下这样写配置就会更加灵活!!!!

第二个配置,初始化请求支付宝请求对象

package com.adn.common.utils;

import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanUtil {
    //创建支付宝所需要的对象
    @Autowired
    AppUtil appUtil;
    @Bean
    public AlipayClient alipayClient(){
        System.out.println(appUtil.toString());
        return new DefaultAlipayClient(appUtil.getGatewayurl(),appUtil.getAppid(),appUtil.getMerchantprivatekey(),"json", appUtil.getCharset(),
                appUtil.getAlipaypublickey(),appUtil.getSigntype());
    }
    
    @Bean    //支付信息的配置
    public AlipayTradePagePayRequest  alipayTradePagePayRequest(){
        return  new AlipayTradePagePayRequest();
    }


}

这个类其实没啥可说的,这里就不过多讲解,强调一下使用的是刚才的配置类就可以了。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;