您现在的位置是:主页 > news > 没有相应营业执照怎么做网站/免费b2b网站有哪些

没有相应营业执照怎么做网站/免费b2b网站有哪些

admin2025/6/9 17:51:12news

简介没有相应营业执照怎么做网站,免费b2b网站有哪些,做网站需要什么知识,南昌网站建设案例写在前面:在线付款,已经成为了我们日常生活中必不可少的一部分。在线报名缴费,在线购物付款,在线转账汇款等等。给我们的生活带来了极大的方便,支付宝和我们的距离也越来越近。之前很痴迷于它的在线付款,鼠…

没有相应营业执照怎么做网站,免费b2b网站有哪些,做网站需要什么知识,南昌网站建设案例写在前面:在线付款,已经成为了我们日常生活中必不可少的一部分。在线报名缴费,在线购物付款,在线转账汇款等等。给我们的生活带来了极大的方便,支付宝和我们的距离也越来越近。之前很痴迷于它的在线付款,鼠…

写在前面:

在线付款,已经成为了我们日常生活中必不可少的一部分。在线报名缴费,在线购物付款,在线转账汇款等等。给我们的生活带来了极大的方便,支付宝和我们的距离也越来越近。之前很痴迷于它的在线付款,鼠标轻轻点击几下就完成了交易。今天也来模仿一下~(本试验是沙箱环境,正式环境所需的手续太复杂,所以先拿沙箱环境练练手)

一、支付宝开发者中心控制台

https://openhome.alipay.com/platform/home.htm

登录并填写一些个人信息即可。接下来在“控制台”找到开发服务。打开研发服务。

二、配置沙箱应用环境

1)进入沙箱环境页面,系统已经自动为你创建一个应用,在 信息配置 中可以看到应用信息。

2)沙箱环境密钥设置支持上传 RSA2(SHA256) 的应用公钥和公钥证书两种形式。配置 RSA2(SHA256) 的应用公钥后,不需要配置 RSA(SHA1) 密钥。

(具体生成密钥说明文档)https://opendocs.alipay.com/open/291/105971

在后面调试过程中,老是报错误码invalid-signature无效签名。回过头来排查发现是应用公钥和私钥配置错了。

3)沙箱账号给我们提供了商家和买家的测试账号。方便我们后期进行模拟支付。

三、配置 应用公钥和私钥

①  下载 支付宝开放平台开发助手 按照下图所示 得到了 应用公钥私钥

②  回到沙箱配置密钥中(RSA2),选择加签模式为公钥。把刚 支付宝开放平台开发助手中生成的 应用公钥 复制进去。

说明:

·        应用公钥(public key)需提供给支付宝账号管理者上传到支付宝开放平台。

·        应用私钥(private key)由开发者自己保存,需填写到代码中供签名时使用。

四、上代码:前端采用thymeleaf进行页面展示

1.对应thymeleaf和支付sdk yml

<dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>3.3.4.ALL</version>
</dependency><!-- thymeleaf模板依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

2.加配置文件

公钥alipayPublicKey私钥merchantPrivateKey在之前支付宝开放平台开发助手那边已经事先生成

两个页面跳转路径:当支付成功时跳转到指定页面用于接收支付成功返回的参数信息

·        服务器异步通知页面路径(notify_url)

·        页面跳转同步通知页面的路径(return_url)

appId、gatewayUrl、signType、charset参照给的Demo一样复制进去就行

#支付宝 沙箱环境
zfb:#APPIDappId: 202100011XXXXXXX#商户私钥merchantPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcgg      #支付宝公钥alipayPublicKey:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA #服务器异步通知页面路径(notify_url)notifyUrl: http://localhost:8181/api/alipayNotifyNotice#页面跳转同步通知页面的路径(return_url)returnUrl: http://localhost:8181/api/alipayReturnNotice#支付宝网关gatewayUrl: https://openapi.alipaydev.com/gateway.dosignType: RSA2charset: utf-8
全局参数变量设置
@Configuration
public class GlobalConfig implements InitializingBean {
@Value("${zfb.appId}")
private String zfbAppId;@Value("${zfb.merchantPrivateKey}")
private String zfbMerchantPrivateKey;@Value("${zfb.alipayPublicKey}")
private String zfbAlipayPublicKey;@Value("${zfb.notifyUrl}")
private String zfbNotifyUrl;@Value("${zfb.returnUrl}")
private String zfbReturnUrl;@Value("${zfb.gatewayUrl}")
private String zfbGatewayUrl;
//===================支付宝 支付=====================
public static String ZFB_APPID;
public static String ZFB_MERCHANT_PRIVATE_KEY;
public static String ZFB_ALIPAY_PUBLICY_KEY;
public static String ZFB_NOTIFY_URL;
public static String ZFB_RETURN_URL;
public static String ZFB_GATEWAY_URL;
@Override
public void afterPropertiesSet() throws Exception {ZFB_APPID = zfbAppId;ZFB_MERCHANT_PRIVATE_KEY = zfbMerchantPrivateKey;ZFB_ALIPAY_PUBLICY_KEY = zfbAlipayPublicKey;ZFB_NOTIFY_URL = zfbNotifyUrl;ZFB_RETURN_URL = zfbReturnUrl;ZFB_GATEWAY_URL = zfbGatewayUrl;}
}

3.主页代码

/*** 主页*/
@RequestMapping(value = "/index",method = RequestMethod.GET)
public ModelAndView index(){return new ModelAndView("index");
}
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><head><meta charset="UTF-8"><title>首页</title></head>
<body><font th:size="30" color="#7fff00">Hello,It's index.html~</font><br/><a href="/api/goShopping">返回商品列表</a></body>
</html>

4.商品列表

/*** 商品列表*/
@RequestMapping(value = "/goShopping",method = RequestMethod.GET)
public ModelAndView goShopping(){List<ZfbProduct> zfbProducts = zfbProductMapper.selectAllProducts();return new ModelAndView("products","pList",zfbProducts);
}
<html lang="en" xmlns:th="http://www.thymeleaf.org" >
<script src="<%=request.getContextPath() %>/static/js/jquery.min.js" type="text/javascript"></script><html><head></head><body><a href="/api/index">Go To Index.html</a><table><tr><td>产品编号</td><td>产品名称</td><td>产品价格</td><td>操作</td></tr><div th:each="p,pList:${pList}" ><tr><td th:text="${p.id}"/><td th:text="${p.name}"/><td th:text="${p.price}" /><td><a th:href="@{/productDetail(productId=${p.id})}">购买</a></td></tr></div>
</table></body></html>

5.具体商品详情页面(下单)

/*** 具体商品详情页面(下单)* @param productId 产品id*/
@RequestMapping(value = "/productDetail",method = RequestMethod.GET)
public ModelAndView productDetail(String productId){ZfbProduct zfbProductDetail = zfbProductMapper.selectByPrimaryKey(productId);return new ModelAndView("productDetail","productDetail",zfbProductDetail);
}

购买个数做了个小小限制。只允许输入数字(整数)不允许有其他字符输入。

<html lang="en" xmlns:th="http://www.thymeleaf.org"><head><!-- <script src="<%=request.getContextPath() %>/static/js/jquery.min.js" type="text/javascript"></script> --><script>function generateOrder() {var productIdVar = [[${productDetail.id}]];var countVar = document.getElementById('ftext').value;// jq 引入的时候报错了,如果用jq的话 var countVar = document.getElementById('ftext').value();// 现在给你写的是原生js的取值方法 document.getElementById('ftext').valueif (countVar === "" || countVar == null) {alert("购买个数不能为空");}else {location.href = "/api/generateOrder?productId=" + productIdVar + "&count=" + countVar;}}
</script>
</head><body><a href="/api/index">Go To Index.html</a><table><tr><td>产品编号:&nbsp;&nbsp;&nbsp;&nbsp;</td><td><div id="productId" th:text="${productDetail.id}" /></td></tr><tr><td>产品名称:&nbsp;&nbsp;&nbsp;&nbsp;</td><td><div th:text="${productDetail.name}" /></td></tr><tr><td>产品价格:&nbsp;&nbsp;&nbsp;&nbsp;</td><td><div th:text="${productDetail.price}" /></td></tr><tr><td>购买个数:&nbsp;&nbsp;&nbsp;&nbsp;</td><td><input id="ftext" onkeyup="if(this.value.length==1){this.value=this.value.replace(/[^1-9]/g,'')}else{this.value=this.value.replace(/\D/g,'')}"onafterpaste="if(this.value.length==1){this.value=this.value.replace(/[^1-9]/g,'')}else{this.value=this.value.replace(/\D/g,'')}" /></td></tr></table><button type="button" onclick="generateOrder()">提交,生成订单!</button>
</body>
<html>

6.生成订单

/*** 生成订单* @param productId 产品id* @param count 购买数量*/
@RequestMapping(value = "/generateOrder",method = RequestMethod.GET)
public ModelAndView generateOrder(String productId,Integer count){ZfbProduct zfbProductDetail = zfbProductMapper.selectByPrimaryKey(productId);ZfbOrders zfbOrder = new ZfbOrders();//订单号zfbOrder.setOrderNum(UUID.randomUUID().toString().replaceAll("-",""));//待付款zfbOrder.setOrderStatus("1");//订单金额BigDecimal orderAmountDecimal = zfbProductDetail.getPrice().multiply(new BigDecimal(count));zfbOrder.setOrderAmount(orderAmountDecimal.toString());//实际支付金额 == 订单金额 [暂且规定只能全额付款]zfbOrder.setPaidAmount(orderAmountDecimal.toString());//产品表外键IDzfbOrder.setProductId(zfbProductDetail.getId());//产品购买的个数zfbOrder.setBuyCounts(count);//订单创建时间zfbOrder.setCreateTime(new Date());//支付时间zfbOrder.setPaidTime(null);zfbOrdersMapper.insertSelective(zfbOrder);Order order = new Order();order.setOrderNum(zfbOrder.getOrderNum());  //订单号order.setName(zfbProductDetail.getName());  //产品名称order.setPrice(orderAmountDecimal);         //订单价格order.setCount(count);                      //购买个数return new ModelAndView("productOrder","order",order);
}
<html lang="en" xmlns:th="http://www.thymeleaf.org"><head></head><body><a href="/api/index">Go To Index.html</a><p> 下单成功!</p><table><tr><td>订单编号:&nbsp;&nbsp;&nbsp;&nbsp;</td><td><div th:text="${order.orderNum}" /></td></tr><tr><td>产品名称:&nbsp;&nbsp;&nbsp;&nbsp;</td><td><div th:text="${order.name}" /></td></tr><tr><td>产品价格:&nbsp;&nbsp;&nbsp;&nbsp;</td><td><div th:text="${order.price}" /></td></tr><tr><td>购买个数:&nbsp;&nbsp;&nbsp;&nbsp;</td><td><div th:text="${order.count}" /></td></tr></table><a th:href="@{/goPay(orderNum=${order.orderNum},price=${order.price})}">前往支付宝支付</a></body><html>

获得初始化的AlipayClient,设置同步&异步通知页面路径,将商品编号、价格、订单名称、商品描述加入请求信息中。

/*** 跳转 支付宝支付页面* @param orderNum 订单号* @param price 订单金额*/
@RequestMapping(value = "/goPay",method = RequestMethod.GET)
public String goAlipay(String orderNum, String price,HttpServletRequest request, HttpServletRequest response) throws Exception {ZfbOrders zfbOrders = zfbOrdersMapper.selectByOrderNum(orderNum);ZfbProduct zfbProduct = zfbProductMapper.selectByPrimaryKey(zfbOrders.getProductId());//获得初始化的AlipayClientAlipayClient alipayClient = new DefaultAlipayClient(GlobalConfig.ZFB_GATEWAY_URL, GlobalConfig.ZFB_APPID, GlobalConfig.ZFB_MERCHANT_PRIVATE_KEY,"json", "utf-8", GlobalConfig.ZFB_ALIPAY_PUBLICY_KEY, "RSA2");//设置请求参数AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();alipayRequest.setReturnUrl(GlobalConfig.ZFB_RETURN_URL);alipayRequest.setNotifyUrl(GlobalConfig.ZFB_NOTIFY_URL);//商户订单号,商户网站订单系统中唯一订单号,必填String out_trade_no = orderNum;//付款金额,必填String total_amount = price;//订单名称,必填String subject = zfbProduct.getName();//商品描述,可空String body = "我买了" + zfbProduct.getName();// 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。该参数数值不接受小数点, 如 1.5h,可转换为 90m。String timeout_express = "1c";alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","+ "\"total_amount\":\""+ total_amount +"\","+ "\"subject\":\""+ subject +"\","+ "\"body\":\""+ body +"\","+ "\"timeout_express\":\""+ timeout_express +"\","+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");//请求String result = alipayClient.pageExecute(alipayRequest).getBody();return result;
}

输入之前沙箱账号提供的买家的测试账号 跳转到支付页面。

支付成功。

7.进入支付宝同步通知页面

/*** @Title: AlipayController.java* @Package com.sihai.controller* @Description: 支付宝同步通知页面*/@RequestMapping(value = "/alipayReturnNotice")public ModelAndView alipayReturnNotice(HttpServletRequest request, HttpServletRequest response) throws Exception {logger.info("支付成功, 进入同步通知接口...");//获取支付宝GET过来反馈信息Map<String,String> params = new HashMap<String,String>();Map<String,String[]> requestParams = request.getParameterMap();for (Iterator<String> 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);}boolean signVerified = AlipaySignature.rsaCheckV1(params, GlobalConfig.ZFB_ALIPAY_PUBLICY_KEY, "UTF-8", "RSA2"); //调用SDK验证签名SuccessPayDto successPayDto = new SuccessPayDto();
//        ModelAndView mv = new ModelAndView("alipaySuccess");//——请在这里编写您的程序(以下代码仅作参考)——if(signVerified) {//商户订单号String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");//支付宝交易号String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");//付款金额String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"),"UTF-8");// 修改叮当状态,改为 支付成功,已付款; 同时新增支付流水zfbOrdersMapper.updateOrderStatus(out_trade_no,"2");//orderService.updateOrderStatus(out_trade_no, trade_no, total_amount);ZfbOrders zfbOrders = zfbOrdersMapper.selectByOrderNum(out_trade_no);ZfbProduct zfbProduct = zfbProductMapper.selectByPrimaryKey(zfbOrders.getProductId());logger.info("********************** 支付成功(支付宝同步通知) **********************");logger.info("* 订单号: {}", out_trade_no);logger.info("* 支付宝交易号: {}", trade_no);logger.info("* 实付金额: {}", total_amount);logger.info("* 购买产品: {}", zfbProduct.getName());logger.info("***************************************************************");successPayDto.setOrderNum(out_trade_no);                //订单编号successPayDto.setOutTradeNo(trade_no);                  //支付宝交易号successPayDto.setPrice(new BigDecimal(total_amount));   //实付金额successPayDto.setName(zfbProduct.getName());            //购买产品return new ModelAndView("alipaySuccess","order",successPayDto);}else {logger.info("支付, 验签失败...");}return new ModelAndView("alipaySuccess","order",successPayDto);}

后台日志可以看到。接收到了支付成功返回的参数信息。

<html lang="en" xmlns:th="http://www.thymeleaf.org"><html><head></head><body><h1 style="color: green;">购买成功</h1><table><tr><td>订单编号: <div th:text="${order.orderNum}" /></td></tr><td>支付宝交易号: <div th:text="${order.outTradeNo}" /></td><tr></tr><td>实付金额: <div th:text="${order.price}" /></td><tr></tr><td>购买产品:<div th:text="${order.name}" /></td></tr></table></body></html>

再来比对前后两次账户余额。买家减少了卖家增加了。

哈哈哈。。小小Demo蕴含了不少东西。细细品味收获良多~