支付宝实现PC扫码支付

1、首先申请企业认证的支付帐户(如不是作公司项目,能够用我的的)算法

2、去支付宝开放平台申请网页移动端应用express

点击开发者中心,选择网页移动应用json

而后选择支付接入api

填写对应的信息,PC扫码支付针对的是电脑端,因此我在此选择网页应用。注意网址的URL填写的是项目在线上运行的网址。 服务器

而后确认建立,选择添加功能,因为该网站还作了H5网页,因此我选择了快捷手机支付,还有选择电脑支付app

而后勾选已经赞成,再去配置应用网关、受权回调地址、设置应用公钥(应用网关、受权回调地址是能够不配置的)post

如下是应用网关设置的截图网站

上传的公用字符就是该应用的应用公钥。在生成密钥时,也会生成应用私钥。咱们能够将私钥保存起来。后面支付接口会用到。编码

而后就能够提交去审核。审核以及签约经过,上线后就能够进行开发啦。url

3、开发环境配置

下载服务端 SDK

能够去支付宝开放平台进行下载 https://docs.open.alipay.com/194/106078

接口调用配置

1AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);

关键参数说明:

配置参数

示例值解释

获取方式/示例值

URL

支付宝网关(固定)

https://openapi.alipay.com/gateway.do

APP_ID

APPID 即建立应用后生成

详情见建立应用并获取 APPID

APP_PRIVATE_KEY

开发者应用私钥,由开发者本身生成

详见配置密钥

FORMAT

参数返回格式,只支持 json 格式

json(固定)

CHARSET

请求和签名使用的字符编码格式,支持 GBK和 UTF-8

开发者根据实际工程编码配置

ALIPAY_PUBLIC_KEY

支付宝公钥,由支付宝生成

详见配置密钥

SIGN_TYPE

商户生成签名字符串所使用的签名算法类型,目前支持 RSA2 和 RSA,推荐商家使用 RSA2。

RSA2

公共参数

请求地址

环境 HTTPS请求地址
正式环境 https://openapi.alipay.com/gateway.do

公共请求参数

参数 类型 是否必填 最大长度 描述 示例值
app_id String 32 支付宝分配给开发者的应用ID 2014072300007148
method String 128 接口名称 alipay.trade.pay
format String 40 仅支持JSON JSON
charset String 10 请求使用的编码格式,如utf-8,gbk,gb2312等 utf-8
sign_type String 10 商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2 RSA2
sign String 344 商户请求参数的签名串,详见签名 详见示例
timestamp String 19 发送请求的时间,格式"yyyy-MM-dd HH:mm:ss" 2014-07-24 03:07:50
version String 3 调用的接口版本,固定为:1.0 1.0
notify_url String 256 支付宝服务器主动通知商户服务器里指定的页面http/https路径。 http://api.test.alipay.net/atinterface/receive_notify.htm
app_auth_token String 40 详见应用受权概述  
biz_content String   请求参数的集合,最大长度不限,除公共参数外全部请求参数都必须放在这个参数中传递,具体参照各产品快速接入文档

具体参数去看支付宝官方文档 https://docs.open.alipay.com/api_1/alipay.trade.pay

接下来,开发者就能够用 alipayClient 来调用具体的 API 了。alipayClient 只须要初始化一次,后续调用不一样的 API 均可以使用同一个 alipayClient 对象。

在application.yml封装属性

@Value("${app.ali-pay-appId}")
private String APP_ID;
/**
 * 应用私钥
 */
@Value("${app.ali-pay-merchantPrivateSign}")
private String APP_PRIVATE_KEY;
/**
 * 支付宝公钥
 */
@Value("${app.ali-pay-aliPublicSign}")
private String ALIPAY_PUBLIC_KEY;
/**
 * 回调地址
 */
@Value("${app.ali-pay-notifyUrl}")
private String notify_url;
/**
 * 签名类型
 */
@Value("${app.ali-pay-signType}")
private String SIGN_TYPE;
/**
 * 编码集
 */
@Value("${app.ali-pay-charset}")
private String CHARSET;
/**
 * 支付宝网关
 */
@Value("${app.ali-pay-payGateWay}")
private String URL;

@Value("${app.order-pay-switch}")
private String flag;

 统一下单接口

//实例化阿里支付
AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);
//建立api对应的request
AlipayTradePagePayRequest  alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setNotifyUrl(notify_url);


//先生成一个随机数当订单号,后续修改正式使用的
String outTradeNo = "" + System.currentTimeMillis();

Map<String,Object> maps = new HashMap<>();
maps.put("out_trade_no",outTradeNo);
maps.put("total_amount","0.01");

maps.put("product_code","FAST_INSTANT_TRADE_PAY");
//产品名后续修改
 maps.put("subject", "Iphone6 16G");
 maps.put("timeout_express","3m");
String postData = JSONObject.toJSONString(maps);
alipayRequest.setBizContent(postData);

logger.info("requestId:{},function:{},request:{}",requestId,"支付宝支付请求参数",postData);
//AlipayTradePagePayResponse response = alipayClient.execute(alipayRequest);
String form = alipayClient.pageExecute(alipayRequest).getBody();
logger.info("requestId:{},function:{},response:{}" , requestId , "aliPay" , form);
logger.info("requestId:{},userId:{},function:{}",requestId,userIds,"发起支付宝支付请求");
//支付宝回调
    @PostMapping(value = "/ali")
    @SkipUserAuth
    public String notify(HttpServletRequest request){
        Map requestParams = request.getParameterMap();
        String q = "";
        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
            String name = (String) iter.next();
            String[] values = (String[]) requestParams.get(name);
            for (int i = 0; i < values.length; i++) {
                q+=name+"="+values[i]+"&";
            }
        }

        System.out.println("支付宝支付结果通知"+requestParams.toString());
        logger.info("requestId:{},function:{},response:{}",requestId,"支付宝支付结果通知",q);
        //获取支付宝POST过来反馈信息
        Map<String,String> params = new HashMap<String,String>();

        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);
        }
        logger.info("requestId:{},function:{},response:{}", requestId , "支付宝回调" , params.toString());

        //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
        try {
            //验证签名
            boolean flag = AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, CHARSET,SIGN_TYPE);
            logger.info("requestId:{},function:{},response:{}", requestId, "支付宝回调验证签名", flag);
            if(flag){
                if("TRADE_SUCCESS".equals(params.get("trade_status"))){

                    //商户订单号
                    String out_trade_no = params.get("out_trade_no");
                    logger.info("打印支付宝回调数据" + out_trade_no);
                    //下面省略修改订单逻辑
                }
            }
        } catch (AlipayApiException e) {
            e.printStackTrace();
            logger.info("requestId:{} err",request ,e);
            logger.error("requestId:{} err",request ,e);
        }
        return "success";
    }

以上就是统一下单接口的方法和验证签名的方法