当前位置: 首页 > news >正文

手机网站开源系统微营销推广方案

手机网站开源系统,微营销推广方案,江津区建设工程交易中心网站,做界面的网站Uniapp Android SpringBoot3 对接支付宝支付(最新教程附源码) 1、效果展示2、后端实现2.1 引入支付宝SDK依赖 pom.xml2.2 配置 application.yml2.3 支付宝相关代码2.3.1 AlipayConfig.java2.3.2 ZfbPayConfig.java2.3.3 支付接口2.3.4 支付回调处理接口&…

Uniapp Android SpringBoot3 对接支付宝支付(最新教程附源码)

  • 1、效果展示
  • 2、后端实现
    • 2.1 引入支付宝SDK依赖 pom.xml
    • 2.2 配置 application.yml
    • 2.3 支付宝相关代码
      • 2.3.1 AlipayConfig.java
      • 2.3.2 ZfbPayConfig.java
      • 2.3.3 支付接口
      • 2.3.4 支付回调处理接口(用于支付成功后,支付宝通知我们支付信息)
      • 2.3.4 退款接口
  • 3 前端代码
    • 3.1 支付接口调用
    • 3.2 支付方法
    • 3.2 退款接口调用

1、效果展示

效果展示

2、后端实现

2.1 引入支付宝SDK依赖 pom.xml

<dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.40.0.ALL</version>
</dependency>

2.2 配置 application.yml

在这里插入图片描述

在这里插入图片描述

真实环境需要开通 APP 支付, 如果是沙箱环境的话不支持退款。

# 支付宝支付
alipay:server_url: https://openapi.alipay.com/gateway.doapp_id: # 你的 appIdprivate_key:  # 你的私钥format: jsonsellerId: 2088722047235165charset: utf-8alipay_public_key: # 你的公钥sign_type: RSA2notifyUrl: http://wtw867.natappfree.cc/app/shop/order/zfb-pay/notify # 支付成功通知地址

2.3 支付宝相关代码

2.3.1 AlipayConfig.java


package com.zhong.config;import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Getter
@Setter
@ToString
@Component
@ConfigurationProperties(prefix = "alipay")
public class AlipayConfig extends com.alipay.api.AlipayConfig {private String serverUrl;private String appId;private String privateKey;private String format;private String charset;private String alipayPublicKey;private String signType;private String notifyUrl;
}

2.3.2 ZfbPayConfig.java


package com.zhong.config;import com.alipay.api.AlipayApiException;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.domain.AlipayTradeRefundModel;
import com.alipay.api.request.AlipayTradeAppPayRequest;import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.alipay.api.response.AlipayTradeRefundResponse;
import com.zhong.model.entity.goods.GoodsOrderInfo;
import com.zhong.service.GoodsOrderInfoService;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;@Configuration
@Component
@Data
@Slf4j
public class ZfbPayConfig {@AutowiredAlipayConfig alipayConfig;@Autowiredprivate GoodsOrderInfoService goodsOrderInfoService;private DefaultAlipayClient client() throws AlipayApiException {return new DefaultAlipayClient(alipayConfig);}public String pay(GoodsOrderInfo order) {String source = "";try {DefaultAlipayClient client = client();AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();model.setSubject("云尚社区");model.setOutTradeNo(order.getOrderNo());model.setTotalAmount(String.valueOf(0.01));// alipay 封装的接口调用AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();request.setBizModel(model);request.setNotifyUrl(alipayConfig.getNotifyUrl());AlipayTradeAppPayResponse response = client.sdkExecute(request);source = response.getBody();} catch (AlipayApiException e) {goodsOrderInfoService.noPay(order.getOrderNo());  // 支付失败更新订单状态,可以根据您的具体业务做出调整log.error("支付出现问题,详情:{}", e.getErrMsg());e.printStackTrace();}log.info(source);return source;}/*** 退款** @param tradeNo* @param totalAmount* @return*/public AlipayTradeRefundResponse refund(String tradeNo, String totalAmount) {try {DefaultAlipayClient client = client();AlipayTradeRefundModel alipayTradeRefundModel = new AlipayTradeRefundModel();alipayTradeRefundModel.setTradeNo(tradeNo);alipayTradeRefundModel.setRefundAmount(totalAmount);AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();request.setBizModel(alipayTradeRefundModel);AlipayTradeRefundResponse response = client.execute(request);return response;} catch (AlipayApiException e) {log.error("退款出现问题,详情:{}", e.getErrMsg());e.printStackTrace();}return null;}}

2.3.3 支付接口


全局统一返回结果类

package com.zhong.result;import lombok.Data;/*** 全局统一返回结果类*/
@Data
public class Result<T> {//返回码private Integer code;//返回消息private String message;//返回数据private T data;public Result() {}private static <T> Result<T> build(T data) {Result<T> result = new Result<>();if (data != null)result.setData(data);return result;}public static <T> Result<T> build(T body, ResultCodeEnum resultCodeEnum) {Result<T> result = build(body);result.setCode(resultCodeEnum.getCode());result.setMessage(resultCodeEnum.getMessage());return result;}public static <T> Result<T> fail(Integer code, String message) {Result<T> result = build(null);result.setCode(code);result.setMessage(message);return result;}public static <T> Result<T> ok(T data) {return build(data, ResultCodeEnum.SUCCESS);}public static <T> Result<T> ok() {return Result.ok(null);}public static <T> Result<T> fail() {return build(null, ResultCodeEnum.FAIL);}
}

支付接口

我这里是多订单的,如果是但订单的话这里 payUrl = zfbPayConfig.pay(goodsOrderInfoArrayList.get(0)); 可以传入一个 orderInfo 方便zfbPayConfig.pay() 获取 tradeNo 和 totalAmount。

   @Operation(summary = "支付商品订单")@GetMapping(value = "/pay/zfb")@ResponseBodypublic Result pay(@RequestParam String id) throws AlipayApiException {List<String> split = List.of(id.split(","));String payUrl = "";// 单个商品的情况if (split.size() == 1) {GoodsOrderInfo orderInfo = service.getById(id);orderInfo.setTotalPrice((orderInfo.getTotalPrice()));payUrl = zfbPayConfig.pay(orderInfo);orderInfo.setCodeUrl(payUrl);orderInfo.setOrderIds(id);service.saveOrUpdate(orderInfo);}// 多个商品else {ArrayList<GoodsOrderInfo> goodsOrderInfoArrayList = new ArrayList<>();BigDecimal price = new BigDecimal("0.00");for (String shopInfoId : split) {GoodsOrderInfo orderInfo = service.getById(shopInfoId);goodsOrderInfoArrayList.add(orderInfo);price = price.add(orderInfo.getPrice().multiply(BigDecimal.valueOf(orderInfo.getGoodNum())));}System.out.println(price);goodsOrderInfoArrayList.get(0).setTotalPrice(price);payUrl = zfbPayConfig.pay(goodsOrderInfoArrayList.get(0));goodsOrderInfoArrayList.get(0).setCodeUrl(payUrl);goodsOrderInfoArrayList.get(0).setOrderIds(id);service.saveOrUpdate(goodsOrderInfoArrayList.get(0));}return Result.ok(payUrl);}

2.3.4 支付回调处理接口(用于支付成功后,支付宝通知我们支付信息)


@PostMapping("/zfb-pay/notify")  // 注意这里必须是POST接口public String payNotify(HttpServletRequest request) {Map<String, String> params = new HashMap<>();Map<String, String[]> requestParams = request.getParameterMap();System.out.println("=========支付宝异步回调========");System.out.println(JSON.toJSONString(requestParams));for (String name : requestParams.keySet()) {String[] values = requestParams.get(name);String valueStr = "";for (int i = 0; i < values.length; i++) {valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";}params.put(name, valueStr);}try {boolean flag = AlipaySignature.rsaCheckV1(params, alipayConfig.getAlipayPublicKey(), alipayConfig.getCharset(), alipayConfig.getSignType());if (flag) {System.out.println("支付回调信息:" + params);// TODO 验签成功System.out.println("支付成功,异步验签成功!");// 验证订单是否为当前订单String orderNumber = params.get("out_trade_no");LambdaQueryWrapper<GoodsOrderInfo> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(GoodsOrderInfo::getOrderNo, orderNumber);
//                    .eq(ShopOrderInfo::getIsDeleted, 0)GoodsOrderInfo orderInfo = service.getOne(queryWrapper);if (orderInfo == null) {throw new LeaseException(ResultCodeEnum.SHOP_ORDER_NOT_FIND_ERROR);}// 验证订单金额是否正确 TODO 测试环境不验证金额都是 0.01
//                BigDecimal totalPrice = new BigDecimal(params.get("total_amount"));
//                BigDecimal totalPriceParam = orderInfo.getTotalPrice();
//                if (!Objects.equals(totalPriceParam, totalPrice)) {
//                    throw new LeaseException(ResultCodeEnum.SHOP_ORDER_TOTAL_PRICE_ERROR);
//                }// 验证商家ID是否一致 防止付给别人了String sellerId = config.getProperty("alipay.sellerId");String sellerIdParams = params.get("seller_id");if (!Objects.equals(sellerId, sellerIdParams)) {throw new LeaseException(ResultCodeEnum.SHOP_ORDER_BUSINESS_PID_ERROR);}// 验证APPID是否一致String appId = config.getProperty("alipay.app_id");String appIdParams = params.get("app_id");if (!Objects.equals(appIdParams, appId)) {throw new LeaseException(ResultCodeEnum.SHOP_ORDER_BUSINESS_APPID_ERROR);}// 检查交易状态String tradeStatus = params.get("trade_status");if (!"TRADE_SUCCESS".equals(tradeStatus) && !"TRADE_CLOSED".equals(tradeStatus)) {throw new LeaseException(ResultCodeEnum.SHOP_ORDER_PAY_ERROR);}// 支付成功if ("TRADE_SUCCESS".equals(tradeStatus)) {// TODO 处理订单业务 修改订单状态 记录支付日志service.processOrder(params);}// 退款操作if ("TRADE_CLOSED".equals(tradeStatus)) {String orderNo = params.get("out_biz_no");service.refund(orderNo);}return "success";} else {// TODO 支付失败标记为未付款String orderNumber = params.get("out_trade_no");service.noPay(orderNumber);return "error";}} catch (AlipayApiException e) {System.out.println("支付宝错误回调:" + e.getErrMsg());e.printStackTrace();return "error";}}

2.3.4 退款接口


ApplyRefund 退款参数

@Data
public class ApplyRefund {private String id;private String refundInfo;private String remarks;
}

退款接口

    @Operation(summary = "申请退款")@PostMapping("apply/refund")public Result applyRefund(@RequestBody ApplyRefund applyRefund) {service.applyRefund(applyRefund);return Result.ok();}

3 前端代码

3.1 支付接口调用


// 支付订单
export const payShopOrderApi = (id) => {return http.get(`/app/shop/order/pay/zfb?id=${id}`)
}

3.2 支付方法


	const toPayFun = async () => {// 调起支付let res = await payShopOrderApi(ids.value);console.log(res.data);uni.requestPayment({//服务提供商 通过uni.getProvider获取provider: 'alipay',//后台返回的订单数据orderInfo: res.data,//调用成功的回调success(res) {uni.showToast({title: "支付成功"})setTimeout(() => {uni.redirectTo({url: "/pages/src/user/user-order/user-order"})}, 500)},//调用失败的回调fail(err) {uni.showToast({title: "支付取消",icon: "none"})setTimeout(() => {uni.redirectTo({url: "/pages/src/user/user-order/user-order"})}, 500)}})}

3.2 退款接口调用


这里我的退款接口放在商家平台,app只负责申请退款,需要商家审核,使用的是TS代码。

// 退款
export interface PostInterfacesRefundRes {orderIds: number,tradeNo: number
}
const openDialog = async (rowData: PostInterfacesRefundRes = {} as PostInterfacesRefundRes,
) => {console.log(rowData);const params = {orderIds: rowData.orderIds,tradeNo: rowData.tradeNo}let res = await postAgreementRefundApi(params);ElMessage.success({ message: `操作成功!` })proTable.value?.getTableList()
}

文章转载自:
http://samurai.c7497.cn
http://changeroom.c7497.cn
http://dinornis.c7497.cn
http://userkit.c7497.cn
http://incarnation.c7497.cn
http://father.c7497.cn
http://trachea.c7497.cn
http://dard.c7497.cn
http://coiffeuse.c7497.cn
http://mott.c7497.cn
http://tokugawa.c7497.cn
http://verbicide.c7497.cn
http://thomson.c7497.cn
http://tricoline.c7497.cn
http://rurigenous.c7497.cn
http://kinfolks.c7497.cn
http://homodyne.c7497.cn
http://lully.c7497.cn
http://unalleviated.c7497.cn
http://establishmentarian.c7497.cn
http://commune.c7497.cn
http://dtp.c7497.cn
http://endoscope.c7497.cn
http://excavation.c7497.cn
http://handwoven.c7497.cn
http://coagulative.c7497.cn
http://filmlet.c7497.cn
http://tomorrer.c7497.cn
http://teachership.c7497.cn
http://talent.c7497.cn
http://splash.c7497.cn
http://nucleoid.c7497.cn
http://coleorhiza.c7497.cn
http://digamous.c7497.cn
http://peroral.c7497.cn
http://clianthus.c7497.cn
http://spitefully.c7497.cn
http://royston.c7497.cn
http://hypersphere.c7497.cn
http://imaginably.c7497.cn
http://indexed.c7497.cn
http://amentaceous.c7497.cn
http://gingerbread.c7497.cn
http://untenanted.c7497.cn
http://verdict.c7497.cn
http://fio.c7497.cn
http://accordingly.c7497.cn
http://counterproof.c7497.cn
http://steepy.c7497.cn
http://tabetic.c7497.cn
http://opsonic.c7497.cn
http://ambulance.c7497.cn
http://photoset.c7497.cn
http://miniascape.c7497.cn
http://coolibah.c7497.cn
http://perinde.c7497.cn
http://yippee.c7497.cn
http://arbitrage.c7497.cn
http://lappish.c7497.cn
http://markedly.c7497.cn
http://blackleggery.c7497.cn
http://beldam.c7497.cn
http://polystyle.c7497.cn
http://enquiring.c7497.cn
http://forzando.c7497.cn
http://nucha.c7497.cn
http://antiquarianize.c7497.cn
http://hirsutism.c7497.cn
http://corrective.c7497.cn
http://eave.c7497.cn
http://malariology.c7497.cn
http://dunk.c7497.cn
http://seismographic.c7497.cn
http://legatary.c7497.cn
http://rhinolith.c7497.cn
http://charioteer.c7497.cn
http://soldierly.c7497.cn
http://cenobian.c7497.cn
http://coleseed.c7497.cn
http://presswork.c7497.cn
http://narcist.c7497.cn
http://incorporation.c7497.cn
http://stethoscopy.c7497.cn
http://tughrik.c7497.cn
http://immunosorbent.c7497.cn
http://horopteric.c7497.cn
http://helistop.c7497.cn
http://menam.c7497.cn
http://lithium.c7497.cn
http://hydropsychotherapy.c7497.cn
http://circumfluence.c7497.cn
http://electrician.c7497.cn
http://voltairean.c7497.cn
http://dibbuk.c7497.cn
http://appointive.c7497.cn
http://adhesively.c7497.cn
http://vegetably.c7497.cn
http://transmigrate.c7497.cn
http://quetta.c7497.cn
http://phut.c7497.cn
http://www.zhongyajixie.com/news/77114.html

相关文章:

  • 网站和微信 微网站解决方案汽车营销活动策划方案
  • 做venn图网站新闻式软文经典案例
  • 无锡专业做网站的公司网站广告投放价格表
  • 网站管理员权限设置权限设置河南郑州网站推广优化外包
  • pc端网站布局百度联盟项目看广告挣钱
  • c#做的网站怎么上传图片seo含义
  • 做捐款网站google推广费用
  • 凡科网做的网站保存后就上传了吗进入百度首页
  • 网站开发面试代理推广
  • 合肥专业做网站今日热点新闻事件标题
  • WordPress 和magento惠州百度seo哪家好
  • 做竞价网站自媒体平台注册
  • 专门做团购的网站有哪些中国教育培训网
  • 做的公司网站风格跟样式和别人一样网站建设方案范文
  • 番禺网站建设公司百度在西安的公司叫什么
  • 浙江创新网站建设销售扬州seo推广
  • 做网站 套用模板之后用什么改广告营销包括哪些方面
  • 建设建设网站的千峰培训可靠吗?
  • 长春网站建设v1视频推广平台
  • wordpress 相册 主题郑州百度网站优化排名
  • java网站开发前景网站底部友情链接代码
  • 可以做软件的网站百度百度百度一下
  • 用discuz做交友网站app推广注册放单平台
  • 如何获得个人免费网站空间网络游戏推广怎么做
  • 和幼儿做网站东莞百度快速排名优化
  • 辽宁建设工程信息网招标文件怎么打开网站优化排名网站
  • wordpress多站点配置教程口碑营销案例简短
  • 广州住建厅官方网站商品seo优化是什么意思
  • 做番号网站犯法吗品牌营销策划公司排名
  • 青岛网站设计流程自己可以做网站吗