【电商项目实战】沙箱支付模拟支付功能

发布时间:2024年01月04日

🎉🎉欢迎来到我的CSDN主页!🎉🎉

🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚

🌟推荐给大家我的专栏《电商项目实战》。🎯🎯

👉点击这里,就可以查看我的主页啦!👇👇

Java方文山的个人主页

🎁如果感觉还不错的话请给我点赞吧!🎁🎁

💖期待你的加入,一起学习,一起进步!💖💖

请添加图片描述

?一、沙箱支付

1.什么是沙箱支付

支付宝沙箱支付(Alipay Sandbox Payment)是支付宝提供的一个模拟支付环境,用于开发和测试支付宝支付功能的开发者工具。在真实的支付宝环境中进行支付开发和测试可能涉及真实资金和真实用户账户,而沙箱环境则提供了一个安全、隔离的环境,使开发者能够模拟支付过程,测试支付功能,而不会使用真实资金。

使用支付宝沙箱支付环境,开发者可以模拟各种支付场景,包括交易创建、支付请求、支付回调等,以验证支付功能的正确性和稳定性。沙箱环境中的所有交易和数据都是虚拟的,不会产生真实的交易或资金流动。

支付宝沙箱支付提供了开发者工具和接口,使开发者能够在模拟环境下进行支付流程的调试和测试。开发者可以在沙箱环境中创建测试账户、配置模拟的交易金额和状态,使用沙箱环境中的接口进行支付操作,并模拟支付回调接口接收支付结果。

通过使用支付宝沙箱支付,开发者可以更安全、更有效地进行支付功能的开发和测试,避免了对真实环境的影响和风险。一旦支付功能在沙箱环境中验证通过,开发者可以将其部署到真实的支付宝生产环境中,与真实用户进行交互和支付。

2.配置沙箱支付

2.1.接入支付宝开放平台

登陆支付宝:支付宝开放平台

点击登录按钮之后,使用手机的支付宝进行二维码扫码登录,如下:

登录成功之后,点击控制台跳转到控制台主页面,将浏览器进度条滚动到最下面,选择沙箱,最后点击沙箱选项即可,如下:

2.2.下载

下载安装支付宝开放平台开发助手:小程序文档 - 支付宝文档中心

注意:请不要安装在含有空格的目录路径下,否则会导致公私钥乱码的问题

安装完成之后,点击“支付宝开放平台开发助手”开始生成密钥。

2.3.配置秘钥

打开支付宝开放平台开发助手,如下:

选择密钥方式,选择RSA2方式,最后点击生成密钥即可生成得到私钥和公钥。

2.4.生成支付宝公钥

根据支付宝开放平台开发助手生成的应用公钥,生成支付宝公钥:

找到支付宝开放平台的沙箱应用一栏,选择“开发信息”接口加签方式中的自定义密钥方式,点击设置并查看按钮:

生成支付宝公钥,如下:

2.5.配置沙箱账号(买家)

配置沙箱账号(买家)并完成手动充值:登录 - 支付宝

2.6.下载沙箱支付宝

下载沙箱支付宝(只支持安卓):登录 - 支付宝

IOS系统不能下载也没关系可以使用账户密码进行登录付款?

二、开发接入

在 Alipay Easy SDK 中,API 的引用路径遵循如下命名规范:

Factory.能力类别.场景类别.接口方法名称( ... )

注意:不同语言连接符可能不一致,以各语言示例为准。

Alipay Easy SDK API 总览

能力类别

场景类别

接口方法名称

Base(基础能力)

OAuth(用户授权)

getToken(获取授权访问令牌和用户 user_id)

Base(基础能力)

OAuth(用户授权)

refreshToken(刷新授权访问令牌)

Base(基础能力)

Qrcode(小程序二维码)

create(创建小程序二维码)

Base(基础能力)

Image(图片)

upload(上传门店照片)

Base(基础能力)

Video(视频)

upload(上传门店视频)

Member(会员能力)

Identification(支付宝身份认证)

init(身份认证初始化)

Member(会员能力)

Identification(支付宝身份认证)

certify(生成认证链接)

Member(会员能力)

Identification(支付宝身份认证)

query(身份认证记录查询)

Payment(支付能力)

Common(通用)

create(创建交易)

Payment(支付能力)

Common(通用)

query(查询交易)

Payment(支付能力)

Common(通用)

refund(交易退款)

Payment(支付能力)

Common(通用)

close(关闭交易)

Payment(支付能力)

Common(通用)

cancel(撤销交易)

Payment(支付能力)

Common(通用)

queryRefund(交易退款查询)

Payment(支付能力)

Common(通用)

downloadBill(查询对账单下载地址)

Payment(支付能力)

Common(通用)

verifyNotify(异步通知验签)

Payment(支付能力)

Huabei(花呗分期)

create(创建花呗分期交易)

Payment(支付能力)

FaceToFace(当面付)

pay(扫用户出示的付款码,完成付款)

Payment(支付能力)

FaceToFace(当面付)

precreate(生成交易付款码,待用户扫码付款)

Payment(支付能力)

App(手机APP)

pay(生成订单串,再使用客户端 SDK 凭此串唤起支付宝收银台)

Payment(支付能力)

Page(电脑网站)

pay(生成交易表单,渲染后自动跳转支付宝网站引导用户完成支付)

Payment(支付能力)

Wap(手机网站)

pay(生成交易表单,渲染后自动跳转支付宝网站引导用户完成支付)

Security(安全能力)

TextRisk(文本内容安全)

detect(检测内容风险)

Marketing(营销能力)

Pass(支付宝卡包)

createTemplate(卡券模板创建)

Marketing(营销能力)

Pass(支付宝卡包)

updateTemplate(卡券模板更新)

Marketing(营销能力)

Pass(支付宝卡包)

addInstance(卡券实例发放)

Marketing(营销能力)

Pass(支付宝卡包)

updateInstance(卡券实例更新)

Marketing(营销能力)

TemplateMessage(小程序模板消息)

send(发送模板消息)

Marketing(营销能力)

OpenLife(生活号)

createImageTextContent(创建图文消息内容)

Marketing(营销能力)

OpenLife(生活号)

modifyImageTextContent(更新图文消息内容)

Marketing(营销能力)

OpenLife(生活号)

sendText(群发本文消息)

Marketing(营销能力)

OpenLife(生活号)

sendImageText(群发图文消息)

Marketing(营销能力)

OpenLife(生活号)

sendSingleMessage(单发模板消息)

Marketing(营销能力)

OpenLife(生活号)

recallMessage(生活号消息撤回)

Marketing(营销能力)

OpenLife(生活号)

setIndustry(模板消息行业设置)

Marketing(营销能力)

OpenLife(生活号)

getIndustry(生活号查询行业设置)

Util(辅助工具)

AES(加解密)

decrypt(解密,常用于会员手机号解密)

Util(辅助工具)

AES(加解密)

encrypt(加密)

Util(辅助工具)

Generic(通用接口)

execute(自行拼接参数,执行OpenAPI调用)

Util(辅助工具)

Generic(通用接口)

sdkExecute(自行拼接参数,生成加签串,功能等同于通用版 SDK 中的 sdkExecute 方法)

注意:各个API的详细参数说明可查看《Alipay Easy SDK API Doc》 ?

1.配置依赖

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

2.配置AlipayConfig

开发文档:小程序文档 - 支付宝文档中心

第一步:修改沙箱支付配置参数:

private Config aliconfig(){
 ? ?Config config=new Config();
 ? ?//沙箱支付宝地址
 ? ?config.gatewayHost="openapi-sandbox.dl.alipaydev.com";
 ? ?//协议https
 ? ?config.protocol="https";
 ? ?//应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
 ? ?config.appId="请填写您的AppId,例如:2019091767145019";
 ? ?//支付宝公钥
 ? ?config.alipayPublicKey="请填写支付宝公钥";
 ? ?//签名方式
 ? ?config.signType="RSA2";
 ? ?//商户私钥(应用私钥),您的PKCS8格式RSA2私钥
 ? ?config.merchantPrivateKey="请填写商户私钥(应用私钥),您的PKCS8格式RSA2私钥";
    return config;
}

注意:这里沙箱支付宝地址有巨坑,由于支付宝沙箱已经全面升级了,导致接口文档与实际的案例接口不匹配,从而影响了以前的老接口的使用,只需要调整接口地址接口,如下:

//沙箱支付宝老地址
config.gatewayHost="openapi.alipaydev.com";
//沙箱支付宝新地址
config.gatewayHost="openapi-sandbox.dl.alipaydev.com";

第二步:修改沙箱支付的支付方式,改成网页支付:

// 2. 发起API调用
// (subject商品标题、outTradeNo订单编号、totalAmount总金额、returnUrl异步通知地址)
AlipayTradePagePayResponse response = Factory.Payment.Page()
 ?  .pay(orderVo.getOid()+"",
 ?      orderVo.getOid()+"",
 ?      orderVo.getTotal().toString(),
 ?      "http://localhost:8081/page/ok.html");

整体代码:

import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kernel.Config;
import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse;
import com.zking.starshop.pojo.Order;
import org.springframework.stereotype.Component;

@Component
public class AlipayConfig {

    private Config aliconfig() {
        Config config = new Config();
        //沙箱支付宝地址
        config.gatewayHost = "openapi-sandbox.dl.alipaydev.com";
        //协议https
        config.protocol = "https";
        //应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
        config.appId = "";
        //支付宝公钥
        config.alipayPublicKey =""
        //签名方式
        config.signType = "RSA2";
        //商户私钥(应用私钥),您的PKCS8格式RSA2私钥
		config.merchantPrivateKey ="";
        return config;
    }

    public String goAlipay(Order order) {
        try {
            // 1. 设置参数(全局只需设置一次)
            Factory.setOptions(aliconfig());
            // 2. 发起API调用(subject商品标题、outTradeNo订单编号、totalAmount总金额、returnUrl异步通知地址)
            AlipayTradePagePayResponse response = Factory.Payment.Page()
                    .pay("商城项目收款",
                            order.getOid().toString(),
                            order.getTotal().toString(),
                            //支付成功之后的异步通知(跳出到自己系统的哪个位置)
                            "http://localhost:8080/order/payDone");
            return response.body;
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

}

?

3.编写回显前端js处理?

?我们在确认订单后需要再向用户确认一遍是否现在支付,回显的时候我们将oid也就是订单id带到前端中去,方便后续操作。

//订单确认回显
return JsonResponseBody.success(oid);


//订单确认请求及回显处理
 $.post('/order/addOrder',order,resp=>{
        if(resp.code===200){
           let boolen= confirm("是否现在付款")
            if(boolen){
                location.href="http://localhost:8080/order/goPay?oid="+resp.data
            }else {
                location.href="http://localhost:8080/order/getCart"
            }

        }
    },'json')

如果我们用户不选择现在支付就跳转订单页面,如果确认支付就调用沙箱支付的接口

?

4.完成沙箱支付?

    //接收oid并将oid传到沙箱支付接口中
    @RequestMapping("/goPay")
    @ResponseBody
    public String goPay(HttpServletRequest request) {
        String oid = (String )request.getAttribute("oid");
        Order order = orderService.getById(oid);
        return new AlipayConfig().goAlipay(order);
    }



    //支付完成回显方法——用于修改订单状态
    @RequestMapping("/payDone")
    @ResponseBody
    public String payDone(@RequestParam Map<String, String> ms) throws Exception {
        Boolean f = Factory.Payment.Common().verifyNotify(ms);
        System.out.println(f);
        String oid = ms.get("out_trade_no");
        //修改订单状态
        orderService.update(new UpdateWrapper<Order>()
                .eq("oid", oid)
                .set("status", 1)
                .set("pay_date", new Date())
        );
        //将缓存中的订单删除
        redisService.deleteOder(oid);
        return "<script>\n" +
                "    alert('支付成功')\n" +
                "    location.href = '/'\n" +
                "</script>";
    }

?

5.流程演示

①结算购物车商品

②订单确认页面

③确认订单后提示是否现在支付

?④点击确定跳转支付宝页面进行账户登录

?⑤登陆成功输入支付密码进行付款

⑥付款成功跳转回调路径进行相应的订单操作?

?

请添加图片描述?

到这里我的分享就结束了,欢迎到评论区探讨交流!!

💖如果觉得有用的话还请点个赞吧 💖

文章来源:https://blog.csdn.net/weixin_74318097/article/details/135383241
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。