网站接入微信支付01--PC端Native扫码支付

目录

## 前言

1.准备工作

1.1 网站域名

1.2 微信公众号

1.3 微信商户平台

2.代码开发

2.1 生成微信支付二维码

2.1.1 选择套餐点击支付

2.1.2 后端核心代码

2.2 扫码支付后,支付结果回调

2.2.1 解析回调结果

2.2.2 更新订单数据

2.2.3 更新用户算力值

2.3 页面同步查询支付回调结果

2.3.1 查到结果后实时同步支付状态

2.3.2 支付成功后给出提示并刷新页面

## 后记


## 前言

前段时间开发AI助手网站,在网站核心功能、用户注册登录等模块开发完成后,最后一步就是支付。打通了在线支付就算是完成了整个开发闭环,几经尝试总算是搞定了,这里简单做个记录:

PS: 项目是vue+golang开发的

1.准备工作

1.1 网站域名

需要有个外网可访问的已备案域名,作为网站微信支付域名配置用。

1.2 微信公众号

需要在微信公众平台申请公众号,在基本配置中获取开发者ID(AppID)等参数

公众平台地址:https://mp.weixin.qq.com/

1.3 微信商户平台

需要在商户平台注册商户号,然后获取商户号、商户证书序列号、商户APIv3密钥等参数

微信商户平台地址:https://pay.weixin.qq.com/index.php/core/info

2.代码开发

2.1 生成微信支付二维码

2.1.1 选择套餐点击支付

前端核心功能代码--生成支付二维码:

//生成支付二维码
const genPayQrcode = () => {
  loading.value = true
  text.value = ""
  httpPost("/api/payment/qrcode", {
    pay_way: curPay.value,
    product_id: curPayProduct.value.id,
    user_id: user.value.id
  }).then(res => {
    showPayDialog.value = true
    qrcode.value = res.data['url']
    activeOrderNo.value = res.data['order_no']
    queryOrder(activeOrderNo.value)
    loading.value = false
    // 重置计数器
    if (countDownRef.value) {
      countDownRef.value.resetTimer()
    }
  }).catch(e => {
    ElMessage.error("生成支付订单失败:" + e.message)
  })
}

 

2.1.2 后端核心代码

支付这里用的是github开源的wechatpay-apiv3/wechatpay-go

// Pay 执行支付请求操作 -Native支付
func (s *HuPiPayService) Pay(params HuPiPayReq) (HuPiResp, error) {
    // 使用 utils 提供的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名
    mchPrivateKey, err := utils2.LoadPrivateKeyWithPath(config.HuPiPayConfig.PrivateKeyWithPath)
    if err != nil {
        logger.Errorf("NewHuPiPay load merchant private key error")
    }
    ctx := context.Background()
    // 使用商户私钥等初始化 client,并使它具有自动定时获取微信支付平台证书的能力
    opts := []core.ClientOption{
        option.WithWechatPayAutoAuthCipher(config.HuPiPayConfig.MchID, config.HuPiPayConfig.MchCertificateSerialNumber, mchPrivateKey, config.HuPiPayConfig.MchAPIv3Key),
    }
    client, err := core.NewClient(ctx, opts...)
    if err != nil {
        logger.Errorf("NewHuPiPay new wechat pay client err:%s", err)
    }

    ctx := context.Background()
    // Native支付
    svc := native.NativeApiService{Client: s.client}
    // 发送请求
    var res HuPiResp
    logger.Infof("Pay params.TotalFee=%s", params.TotalFee)
    totalFee, err := strconv.ParseInt(strings.Split(params.TotalFee, ".")[0], 10, 64)
    logger.Infof("Pay totalFee=%d", totalFee)
    if res.ErrCode != 0 {
        logger.Errorf("HuPiPay Pay ParseInt err:%s", err)
        return res, nil
    }
    resp, result, err := svc.Prepay(ctx,
        native.PrepayRequest{
            Appid:       core.String(s.appId),
            Mchid:       core.String(s.mchID),
            Description: core.String("小麦AI智能助手-会员充值"),
            OutTradeNo:  core.String(params.TradeOrderId),
            Attach:      core.String("自定义数据说明"),
            NotifyUrl:   core.String(s.notifyURL),
            Amount: &native.Amount{
                Total: core.Int64(totalFee),
            },
        },
    )
    // 使用微信扫描 resp.code_url 对应的二维码,即可体验Native支付
    logger.Infof("Pay status=%d resp=%s", result.Response.StatusCode, resp)
    res.URL = *resp.CodeUrl
    return res, nil
}

最终生成的微信支付链接是这种格式:weixin://wxpay/bizpayurl?pr=REo4PlHz1,然后前端拿到支付链接通过qrcode以二维码样式展示,用户即可微信扫码下单:

DEMO 体验地址:https://ai.xiaomaicoder.com/login

2.2 扫码支付后,支付结果回调

支付结果回调地址NotifyUrl是发起支付的时候自己配置的,对应配置的域名需要和微信公众号配置的保持一致。

2.2.1 解析回调结果

这里用的是github开源的 go-pay/gopay

// WxPayNotify 微信支付异步回调
func (h *PaymentHandler) WxPayNotify(c *gin.Context) {
	err := c.Request.ParseForm()
	if err != nil {
		c.String(http.StatusOK, "fail")
		return
	}
	notifyReq, err := wechat.V3ParseNotify(c.Request)
	if err != nil {
		logger.Errorln("------ WxPayNotify V3ParseNotify ERR ------", err.Error())
		c.JSON(http.StatusOK, &wechat.V3NotifyRsp{Code: gopay.FAIL, Message: "回调内容异常"})
		return
	}
	logger.Infof("WxPayNotify 返回值notifyReq: %+v\n", notifyReq)

	// 普通支付通知解密
	result, rErr := notifyReq.DecryptCipherText(h.App.Config.HuPiPayConfig.MchAPIv3Key)
	if rErr != nil {
		logger.Errorln("------ WxPayNotify DecryptCipherText Error ------", rErr.Error())
		c.JSON(http.StatusOK, &wechat.V3NotifyRsp{Code: gopay.FAIL, Message: "内容解密失败"})
		return
	}
	logger.Infof("返回值result: %+v\n", result)
	if result != nil && result.TradeState == "SUCCESS" {
		logger.Infof("------ WxPayNotify PushMessToPayQueue START 【" + result.OutTradeNo + "】------")
		orderNo := result.OutTradeNo
		tradeNo := result.TransactionId
		logger.Infof("收到微信订单支付回调,订单 NO:%s,交易流水号:%s", orderNo, tradeNo)
		//更新订单等具体业务逻辑
		err = h.notify(orderNo, tradeNo) 
		if err != nil {
			c.String(http.StatusOK, "fail")
			return
		}
		c.String(http.StatusOK, "success")
		logger.Infof("------ WxPayNotify PushMessToPayQueue END 【" + result.OutTradeNo + "】------")
	}
	logger.Infof("--------------------- WxPayNotify END ---------------------")
}

2.2.2 更新订单数据

根据具体业务逻辑处理

2.2.3 更新用户算力值

根据具体业务逻辑处理

2.3 页面同步查询支付回调结果

2.3.1 查到结果后实时同步支付状态

2.3.2 支付成功后给出提示并刷新页面

//查询订单支付状态
const queryOrder = (orderNo) => {
  httpPost("/api/payment/query", {order_no: orderNo}).then(res => {
    if (res.data.status === 1) {
      text.value = "扫码成功,请在手机上进行支付!"
      queryOrder(orderNo)
    } else if (res.data.status === 2) {
      text.value = "支付成功,正在刷新页面"
      if (curPay.value === "payjs") {
        setTimeout(() => location.reload(), 3000)
      } else {
        setTimeout(() => location.reload(), 500)
      }
    } else {
      // 如果当前订单没有过期,继续等待订单的下一个状态
      if (activeOrderNo.value === orderNo) {
        queryOrder(orderNo)
      }
    }
  }).catch(e => {
    ElMessage.error("查询支付状态失败:" + e.message)
  })
}

## 后记

至此PC端微信Native扫码支付开发工作已完成,调试功能OK即可。

最后提一下自己的小站(支持微信一键登录),提供了chatGPT等多种AI对话及MJ绘画功能。

体验地址:https://ai.xiaomaicoder.com/login,欢迎体验交流!

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本火锅店点餐系统采用Java语言和Vue技术,框架采用SSM,搭配Mysql数据库,运行在Idea里,采用小程序模式。本火锅店点餐系统提供管理员、用户两种角色的服务。总的功能包括菜品的查询、菜品的购买、餐桌预定和订单管理。本系统可以帮助管理员更新菜品信息和管理订单信息,帮助用户实现在线的点餐方式,并可以实现餐桌预定。本系统采用成熟技术开发可以完成点餐管理的相关工作。 本系统的功能围绕用户、管理员两种权限设计。根据不同权限的不同需求设计出更符合用户要求的功能。本系统中管理员主要负责审核管理用户,发布分享新的菜品,审核用户的订餐信息和餐桌预定信息等,用户可以对需要的菜品进行购买、预定餐桌等。用户可以管理个人资料、查询菜品、在线点餐和预定餐桌、管理订单等,用户的个人资料是由管理员添加用户资料时产生,用户的订单内容由用户在购买菜品时产生,用户预定信息由用户在预定餐桌操作时产生。 本系统的功能设计为管理员、用户两部分。管理员为菜品管理、菜品分类管理、用户管理、订单管理等,用户的功能为查询菜品,在线点餐、预定餐桌、管理个人信息等。 管理员负责用户信息的删除和管理,用户的姓名和手机号都可以由管理员在此功能里看到。管理员可以对菜品的信息进行管理、审核。本功能可以实现菜品的定时更新和审核管理。本功能包括查询餐桌,也可以发布新的餐桌信息。管理员可以查询已预定的餐桌,并进行审核。管理员可以管理公告和系统的轮播图,可以安排活动。管理员可以对个人的资料进行修改和管理,管理员还可以在本功能里修改密码。管理员可以查询用户的订单,并完成菜品的安排。 当用户登录进系统后可以修改自己的资料,可以使自己信息的保持正确性。还可以修改密码。用户可以浏览所有的菜品,可以查看详细的菜品内容,也可以进行菜品的点餐。在本功能里用户可以进行点餐。用户可以浏览没有预定出去的餐桌,选择合适的餐桌可以进行预定。用户可以管理购物车里的菜品。用户可以管理自己的订单,在订单管理界面里也可以进行查询操作。
ASP.NET Core Web 可以通过微信支付提供的 API 进行支付接入。下面是实现步骤: 1. 申请微信支付账号和开通支付功能。在申请过程中,需要提供商户信息和开户银行信息等。 2. 在 ASP.NET Core Web 中引入微信支付 SDK,可以通过 NuGet 包管理器安装。 ``` Install-Package Senparc.Weixin.MP.Pay ``` 3. 在 ASP.NET Core Web 项目中添加配置文件 appsettings.json,用于存储微信支付相关的配置参数,如下所示: ``` { "WeixinPay": { "MchId": "微信支付分配的商户号", "AppId": "应用ID", "Key": "商户支付密钥" } } ``` 4. 在 ASP.NET Core Web 项目中创建一个控制器,用于处理支付的请求。控制器代码如下所示: ``` [Route("api/[controller]")] [ApiController] public class WeixinPayController : ControllerBase { private readonly IOptions<WeixinPayOptions> _options; public WeixinPayController(IOptions<WeixinPayOptions> options) { _options = options; } [HttpPost("unifiedorder")] public async Task<IActionResult> UnifiedOrder([FromBody]UnifiedorderRequest request) { // 设置请求参数 var data = new TenPayV3UnifiedorderRequestData( body: request.Body, outTradeNo: request.OutTradeNo, totalFee: request.TotalFee, spbillCreateIp: request.SpbillCreateIp, notifyUrl: request.NotifyUrl, tradeType: "NATIVE", productId: request.ProductId ); // 调用统一下单 API 进行支付 var result = await TenPayV3.UnifiedorderAsync(_options.Value.AppId, _options.Value.MchId, _options.Value.Key, data); // 处理返回结果 if (result.ReturnCode == "SUCCESS" && result.ResultCode == "SUCCESS") { // 生成二维码图片 var url = result.CodeUrl; var qrCode = new QRCodeGenerator().CreateQrCode(url, QRCodeGenerator.ECCLevel.Q); // 返回二维码图片 return File(qrCode.GetGraphic(20), "image/png"); } // 返回错误信息 return BadRequest(result.ReturnMsg); } } ``` 5. 创建一个模型类,用于保存支付的请求参数。 ``` public class UnifiedorderRequest { public string Body { get; set; } public string OutTradeNo { get; set; } public int TotalFee { get; set; } public string SpbillCreateIp { get; set; } public string NotifyUrl { get; set; } public string ProductId { get; set; } } ``` 6. 在 Startup.cs 文件中添加微信支付相关的配置,代码如下所示: ``` services.Configure<WeixinPayOptions>(Configuration.GetSection(nameof(WeixinPayOptions))); ``` 7. 启动 ASP.NET Core Web 项目,使用 Postman 或其他工具向接口发送支付的请求,请求参数包括:商品描述、商户订单号、总金额、终 IP、通知地址、商品 ID 等。 ``` POST /api/weixinpay/unifiedorder HTTP/1.1 Host: localhost:5000 Content-Type: application/json { "body": "测试商品", "outTradeNo": "123456", "totalFee": 1, "spbillCreateIp": "127.0.0.1", "notifyUrl": "http://localhost:5000/api/weixinpay/notify", "productId": "123456" } ``` 8. 如果请求成功,将返回一个二维码图片,可以使用码工具描该二维码进行支付。如果请求失败,将返回错误信息。 以上就是 ASP.NET Core Web 支付功能接入微信支付的实现步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值