支付宝当面付开发测试(使用沙箱)

第一步:https://open.alipay.com/develop/sandbox/app 沙箱地址
在这里插入图片描述

从这里可以获取四个参数
gatewayUrl 沙箱网关地址
app_id=appid
alipay_public_key=私钥
alipay_private_key=公钥
notify_url=回调地址
配置好appid,公钥,私钥,沙箱的网关地址,他是跟正式的地址是不一样的

第二步:使用ngrok将本地的地址暴露到公网上,(支付宝的回调必须是在公网上的,使用这种方法就可以在127.0.0.1的本机上将端口暴露出去)
地址https://www.ngrok.cc/download.html
​开通隧道,美国是免费的,但是非常不稳定,所以可以自掏腰包开通一个十块钱的,按照教程配好即可。使用ngrok必须要实名严重,又是两块钱T_T。
在这里插入图片描述

第三步:去支付宝的接口文档:
当面付的地址->网页接口文档:https://opendocs.alipay.com/open/02ekfg?pathHash=d3c84596&scene=19&ref=api

在这里插入图片描述

可以看到大体流程就是你发请求到支付宝,支付宝返回json格式的数据
{
“alipay_trade_precreate_response”: {
“code”: “10000”,
“msg”: “Success”,
“out_trade_no”: “25536be6-f26e-31p5-u2ta-a38f7995ed11”,
“qr_code”: “https://qr.alipay.com/bax09048pgtucni3clfi00d6”
},
“sign”: “R0618vMuHRtVspBbp8Jk/0cpSbe5zA3+qNuTMD24WUT1ypf13fNrTWmwL2JYbEEpISv/cU7zFaOz2qAPiJ4iefqPuaYC/wtF5tAsKE+FIMd6Er80voxltg+AJ7Mw97IODwg0d7ltYct4LpRWTPcHPv1LjbG6/C4w19bZgxkFbBy6LaMB0h+3jNTOx09IEfOGNe9v9O57zm+ouTUDTrIIpxQpwnroX+YxHGME22hK5SicaHo1YxJoSaKxp367dqLskL5e+ZvrmBoXGPniaYhMc7XAq0hbJde60xkHpFrLfUuyqFu6JB9ezFyHb5KJSNCv6pyMTwYtsgPD5wSzQR0XlA==”
}

out_trade_no就是二维码!!!

此处准备一个java二维码显示google的zxing:
依赖:

<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.4.1</version>
</dependency>
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>javase</artifactId>
    <version>3.4.1</version>
</dependency>

代码:

package com.szlib.pay;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class QRCodeGenerator {

    public static void main(String[] args) {
        String content = "https://qr.alipay.com/bax09048pgtucni3clfi00d6";

        int width = 300;
        int height = 300;
        String format = "png";
        Map<EncodeHintType, Object> hints = new HashMap<>();
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");

        try {
            QRCodeWriter writer = new QRCodeWriter();
            BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, hints);
            MatrixToImageWriter.writeToPath(bitMatrix, format, new File("qrcode.png").toPath());
            System.out.println("二维码生成成功");
        } catch (WriterException | IOException e) {
            e.printStackTrace();
        }
    }
}

生成一张png的二维码图片。

准备充分之后就可以去文档里面找到示例代码了(也可以使用沙箱测试)
示例代码:

package com.java.sdk.demo;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.CertAlipayRequest;
import com.alipay.api.AlipayConfig;
import com.alipay.api.domain.AlipayTradePrecreateModel;
import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.alipay.api.request.AlipayTradePrecreateRequest;
import com.alipay.api.FileItem;
import java.util.Base64;
import java.util.ArrayList;
import java.util.List;

public class AlipayTradePrecreate {

    public static void main(String[] args) throws AlipayApiException {
        String privateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCeOgURZ+JRz3UdRYFlEdJ/n7H1QnLFK78xsTwzjzYSQA53bjKhA8s3g12NP40mYdou7KD2VYxOxFL+BxMCbvItpTnZWgR71te74WLavRZEo61aEazIUfevQ/d4L7/OIzg8LSWovPtX8Y0DZsVsH/bQ0+v6pxoSL0hHrXBKXRxLcSCjEhWFckxHEijUFhesj2fTSi8ZfW6T5pNrqLK3fvWxBsygtCfXyslMgbU9AWnGFbuax6IXGtbglY7M0iOc+BJDJgTzylUK2M/7NIeiK8hNtj/tzAj2dU5xFyk6yGDjNYQSs5EI/kUZ2qplWP726AVoPDkFFr17fdClx3RWId8HAgMBAAECggEAIEPMjMQWToBzbUijHi0IM6Yo785hAPvuvP9bO1hUulv9lzUNdfAEHInZJdhzvAPwLelq2VCQj+9QzSQ8KB7fm5c5uKy2hVpGG7XWJqywQcburpM0HJU6YK8HY6a5AhwEd6DtMP94cXJ8QtlOIMJT3jmYwUAZ/ONPZe5kG4XpIyjX0awt7ROLg8ypZsvpL16R5fDSbUD5ZD8G3E/CAX7S/9JQZSAjC+W+9bXrZbpYjVXoDyd6D8TLu+X8iYeOsUfgJ8uL0kl4SLCcVdePpdRDqiNNTOMuFMuLv+9L7RP0JJcaGtdVbDsR2Rq+Bct+c0RyhgE4+NT/sT+UqB+inPszYQKBgQDh5zgUXseUb0bpGyvG/g6y8vCS+J/87JGZYRVHmdljROOMPI7MLEjltiL4zcSWt3NhQyunBmnC3J6lMrzFlQXXk22kjOBdFpZX7hZ2dAoWGjAYFhy0c5zzBuh3akw2YYGOoHQIDb2p2kT07Xvgd28OHFMEAwb+SxcMrD1zo2YIkwKBgQCzTpYMAe+XcZMPiU6KFi3tuK72MrrWAeSp1DMO1jevGwtq2fur5PXEGv0sPD/YgOjljBr/6C38BNndHxm7CUa3viGWndQU4GWen2TqYccZIzkVOCUe3/0Mp85hlQb8I4v8dVy5Q0TvJeePTJ5vqo5i5+v8MMOmPkjE5mCmbG9cPQKBgQDTbCs4JVx0t5COKjfWjYAESwqNAtP5Sw8ZlZrs4Dhsh9TPMv4SaH/xPX2NjkcnJ5p8tPjt4TqqfQCda9bwtIA7OmerUY3KkZEzykiLpB6sgOXyJP/Ig0uoyBZZbMrXOnqemdz+jJ2tkfJnqLv/YMg3VJr9bjflVzHDUpBQ4eRksQKBgE9E5cbHMFHGbxpGPIeFiKZ4qDjFcp3b1mhSHIRppdJu5VxGpCF5JkGdIOHmfN9NFiktCF6sGXA6AMrlze1HC5F9p8G7YqAcGDDJDMcllOyDCuBbouWEZo2qve2cAauEV4WzqNtqZtZG7pkGaWC6iRomp8glEsmy7V7G7mGEvLKNAoGBAJvmNdb/Pv7rSFLNdeMzGWj4kL3nEPS22jmX53nAcdB60M4mMrGl4whTGTillZF7XSfjgDc6v/FP5cfJ1fu3cHebqN8xcsLj5UxwYlxIwoy26rVM0V1rhzk3BwesBnjc5yll4vwghaxGWtgU5Oa/8tNWen2w9BXD1T3ltZMiqVFf";
        String alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqsnddoX5EalotNbur+leO+TIaPCCmlOZ24uAaK007X5WIQEF5qJGKbg7Es/qkdxKWpDqgcNPhEuapcCjP957PkB49++zS2eeqwvhbIwQMj1FNFGBMfCqntm1oVnk8zTQyMzp2gJQKx9LM8i9bofn23dnY6cg5rm+y62l5oM2eNlcyrAI2TCrGHb/GCFhWtuiuHiMU+pe58Y5sG74O0GHtJe3PA8dc6hHAaX7tyVOZTi2syg86Nvu2oGC1cGClx71/dKaaHazZ8t72xbrBfsWsvQ6KZx2sqxTDZaeFbENistftRFep4gNk1onwsk1rPUCKLKqlS4lzM2+MKuWuFU4RwIDAQAB";
        AlipayConfig alipayConfig = new AlipayConfig();
        alipayConfig.setServerUrl("https://openapi-sandbox.dl.alipaydev.com/gateway.do");
        alipayConfig.setAppId("9021000133698258");
        alipayConfig.setPrivateKey(privateKey);
        alipayConfig.setFormat("json");
        alipayConfig.setAlipayPublicKey(alipayPublicKey);
        alipayConfig.setCharset("UTF-8");
        alipayConfig.setSignType("RSA2");
        AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
        AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
        model.setOutTradeNo("20150320010101001");
        model.setTotalAmount("88.88");
        model.setSubject("Iphone6 16G");
        request.setBizModel(model);
        AlipayTradePrecreateResponse response = alipayClient.execute(request);
        System.out.println(response.getBody());
        if (response.isSuccess()) {
            System.out.println("调用成功");
        } else {
            System.out.println("调用失败");
            // sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接
            // String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
            // System.out.println(diagnosisUrl);
        }
    }
}

拿到二维码的code就行了。比较麻烦的主要就是回调的地址
如果是手机支付显示二维码的那种需要配置回调的页面return_url这个页面也是需要外网可以调用的,要让支付宝可以调用到。

当面付就不需要了只需要notify_url回调地址即可。
注意:
支付宝沙箱的地址以及ngrok的域名以及程序里的地址要保持同一域名,且路径相同,否则将会出现没有回调的情况。
回调的参数是路径参数?sign=xxx的形式,非常长,有二十多个参数
在springboot中使用@RequestParam Map<String, String> paramMap接收即可

vetx中没有paramMap但是有MultiMap
进行以下转换即可

MultiMap multiMap = routingContext.request().params();
multiMap.forEach((key,value)-> paramMap.put(key,value));

回调接口里面要进行的操作:
1.验签,防止被乱传

boolean signVerified = AlipaySignature.rsaCheckV1(paramMap, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type);

2.判断状态

paramMap.get("trade_status");
"TRADE_SUCCESS".equals(trade_status) || "TRADE_FINISHED".equals(trade_status))

3.获取订单号

paramMap.get("out_trade_no");

4.后续操作

到此一次支付宝支付就结束了,将配置切到正式环境即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值