微信小程序开发实战11_1 微信支付下单

这篇具有很好参考价值的文章主要介绍了微信小程序开发实战11_1 微信支付下单。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

微信支付流程图

微信支付存在多个业务流程,包括微信支付流程、退款流程等。本章节主要介绍微信的支付下单流程,图12-1是微信支付流程的交互图:
微信小程序开发实战11_1 微信支付下单
重点环节说明

  • 步骤1:小程序端用户向商户服务器发起支付请求,重点是提供用户信息、商品信息、支付金额等参数。
  • 步骤3:商户服务器调用支付统一下单接口生成微信支付订单,调用成功后返回预支付交易会话标识(prepay_id),该参数将用于小程序前端的接口调用。
  • 步骤6:获取prepay_id后,需要再次签名,然后把签名参数以及prepay_id等参数返回给小程序。
  • 步骤9:小程序调用接口:wx.requestPayment调起微信支付,发起支付请求。
  • 步骤15:用户支付成功后,商户服务器可接收到微信支付支付结果通知,商户服务器收到通知后更新订单的支付状态。
  • 步骤20:商户在没有接收到微信支付结果通知的情况下需要主动调用查询订单API查询支付结果。

12.1提交支付订单

商户系统调用该接口生成预支付交易单。提交支付订单的请求URL为:
https://api.mch.weixin.qq.com/v3/pay/partner/transactions/jsapi
提交支付订单的接口的请求参数如下:

参数名 变量 描述
服务商应用ID sp_appid 必填)服务商申请的公众号appid。
服务商户号 sp_mchid (必填)服务商户号,由微信支付生成并下发
子商户应用ID sub_appid (必填)子商户申请的公众号appid。若sub_openid有传的情况下,sub_appid必填,且sub_appid需与sub_openid对应
子商户号 sub_mchid (必填)子商户的商户号,由微信支付生成并下发。
商品描述 description (必填)商品描述
商户订单号 out_trade_no (必填)商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一。
结束时间 time_expire 订单失效时间。
附加数据 attach 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用
通知地址 notify_url (必填)通知URL必须为直接可访问的URL,不允许携带查询串。
优惠标记 goods_tag 订单优惠标记
+结算信息 settle_info 结算信息
-是否分账 profit_sharing 是否指定分账,枚举值true:是false:否
+订单金额 amount (必填)订单金额信息
-总金额 total (必填)订单总金额,单位为分。
-货币类型 currency CNY:人民币,境内商户号仅支持人民币。
+支付者 payer 支付者信息
-用户标识 sp_openid 用户在服务商appid下的唯一标识。
-用户子标识 sub_openid 用户在子商户appid下的唯一标识。若传sub_openid,那sub_appid必填

调用成功后返回:预支付交易会话标识(prepay_id),该参数用于小程序前端的接口调用中,该值的有效期为2小时。以下是实现提交支付订单的代码逻辑,首先给出的是统一下接口使用的数据结构:

//订单数据
type WxAppOrderData struct {
   //子商户用ID(服务商)
   Sub_appid          string `json:"sub_appid,omitempty"`
   //子商户的商户号(服务商)
   Sub_mchid          string `json:"sub_mchid,omitempty"`
   //商品描述
   Description        string `json:"description"`
   //商户系统内部订单号
   Out_trade_no       string `json:"out_trade_no"`
   //交易结束时间
   Time_expire        string `json:"time_expire,omitempty"`
   //附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用
   Attach                string `json:"attach,omitempty"`
   //通知URL必须为直接可访问的URL,不允许携带查询串
   Notify_url           string `json:"notify_url"`
   //订单优惠标记
   Goods_tag          string `json:"goods_tag,omitempty"`
   //订单金额信息
   Amount OrderCreateAmount      `json:"amount"`
   //支付者信息
   Payer OrderPayer            `json:"payer"`
   //统一下单结算信息
   Settle_info OrderCreateSettle  `json:"settle_info"`
}

//统一下单请求参数
type WxAppOrderCreateReq struct {
   //应用ID(普通商户)
   Appid             string `json:"appid,omitempty"`
   //直连商户号(普通商户)
   Mchid                 string `json:"mchid,omitempty"`
   //服务商用ID(服务商)
   Sp_appid              string `json:"sp_appid,omitempty"`
   //服务商户号(服务商)
   Sp_mchid           string `json:"sp_mchid,omitempty"`
   //订单数据
   WxAppOrderData
}

//统一下单返回参数
type WxAppOrderCreateRet struct {
   //详细错误码
   Return_code       string     `json:"code"`
   //错误描述
   Return_msg        string     `json:"message"`
   //预支付交易会话标识。用于后续接口调用中使用,该值有效期为2小时
   Prepay_id         string     `json:"prepay_id"`
}

微信支付为直连商户模式以及服务商模式提供了不同的调用接口(具有不同的接口地址以及请求参数)。本文中直连商户模式以及服务商模式共用一套数据结构,并通过json的omitempty标签来适应两种模式的区别。接下来给出服务商模式下接口调用的实现逻辑:

//支付统一下单
//data:支付订单信息
func (ent *MchWxapp) createOrderX(data WxAppOrderData) (WxAppPayParam, error)  {
   var preq WxAppOrderCreateReq
   preq.Sp_appid = ent.Appid
   preq.Sp_mchid = ent.Mchid
   preq.WxAppOrderData = data
   data_body, _ := json.Marshal(preq)

   var param_ent WxAppPayParam
   var pret WxAppOrderCreateRet
   const url = "https://api.mch.weixin.qq.com/v3/pay/partner/transactions/jsapi"
   result, err := WxPayPostV3((*MchParam)(ent), url, data_body)
   if err != nil {
      return param_ent, err
   }
   err = json.Unmarshal([]byte(result), &pret)
   if err != nil {
      fmt.Println(err)
      return param_ent, err
   }
   if pret.Prepay_id == "" {
      return param_ent, errors.New(pret.Return_msg)
   }

   //小程序客户端支付参数
   param_ent.Appid = preq.Sub_appid
   param_ent.TimeStamp = fmt.Sprintf("%d", time.Now().Unix())
   param_ent.NonceStr, _= GenerateNonce()
   param_ent.Prepay_id = pret.Prepay_id
   param_ent.Package = "prepay_id=" + pret.Prepay_id
   param_ent.SignType = "RSA"
   param_ent.PaySign, _ = param_ent.GenPaySignV3(ent.MchPrivateKey)
   return param_ent, nil
}

通过JSAPI下单成功获取预支付交易会话标识(prepay_id)后,需要通过小程序调用支付API(wx.requestPayment)来拉起微信客户端进行支付。wx.requestPayment需要将请求参数进行签名,签名计算的逻辑如下:
1)构造签名串
签名串一共有四行,每一行为一个参数。行尾以\n结束,包括最后一行。参与签名字段及格式为:
小程序appId\n时间戳\n随机字符串\n订单详情扩展字符串\n
2)计算签名值
使用商户私钥对签名串进行SHA256 with RSA签名,并对签名结果进行Base64编码得到签名值。
接下来给出小程序参数签名计算的实现代码,首先给出返回给小程序所需的支付数据的数据结构:

type WxAppPayParam struct{
   Appid string
   TimeStamp string
   NonceStr string
   Prepay_id string
   Package string
   SignType string
   PaySign string
}

接下来使用商户私钥对签名串进行SHA256 with RSA签名,并对签名结果进行Base64编码来计算签名值:

func (ent *WxAppPayParam)GenPaySignV3(mch_pem_key *rsa.PrivateKey) (string, error) {
   SignatureMessageFormat := "%s\n%s\n%s\n%s\n"
   message := fmt.Sprintf(SignatureMessageFormat, ent.Appid, ent.TimeStamp, ent.NonceStr, ent.Package)
   signatureResult, err := SignSHA256WithRSA(mch_pem_key, message)
   if err != nil {
      return "", err
   }
   return signatureResult, nil
}

直连商户的下单接口与服务商下单接口基本一致,除了接口地址不同外,下单时不需要提供子商户号(sub_mchid), 也不需要提供子商户子商户的应用ID(sub_appid)。直连商户下单接口的请求URL为:
https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi
直连商户下单接口的请求参数如下:

参数名 变量 描述
应用ID appid body 由微信生成的应用ID,全局唯一。请求基础下单接口时请注意APPID的应用属性,例如公众号场景下,需使用应用属性为公众号的APPID
直连商户号 mchid body 直连商户的商户号,由微信支付生成并下发。
商品描述 description body 商品描述
商户订单号 out_trade_no body 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一
交易结束时间 time_expire body 订单失效时间,time_expire只能第一次下单传值,不允许二次修改,二次修改系统将报错。如用户支付失败后,需再次支付,需更换原订单号重新下单。
附加数据 attach body 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用
通知地址 notify_url body异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。 公网域名必须为https,如果是走专线接入,使用专线NAT IP或者私有回调域名可使用http
订单优惠标记 goods_tag body 订单优惠标记
订单金额 amount body 订单金额信息
支付者 payer body 支付者信息
优惠功能 detail body 优惠功能
场景信息 scene_info body 支付场景描述
结算信息 settle_info body 结算信息

以下是直连商户下单接口访问的代码实现:文章来源地址https://www.toymoban.com/news/detail-493893.html

func (ent *MchWxapp) createOrder(data WxAppOrderData) (WxAppPayParam, error)  {
   var preq WxAppOrderCreateReq
   preq.Appid = ent.Appid
   preq.Mchid = ent.Mchid
   preq.WxAppOrderData = data
   data_body, _ := json.Marshal(preq)

   var param_ent WxAppPayParam
   var pret WxAppOrderCreateRet
   const url = "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi"
   result, err := WxPayPostV3((*MchParam)(ent), url, data_body)
   if err != nil {
      return param_ent, err
   }

   err = json.Unmarshal([]byte(result), &pret)
   if err != nil {
      return param_ent, err
   }

   if pret.Prepay_id == "" {
      return param_ent, errors.New(pret.Return_msg)
   }

   //小程序客户端支付参数
   param_ent.Appid = preq.Appid
   param_ent.TimeStamp = fmt.Sprintf("%d", time.Now().Unix())
   param_ent.NonceStr, _= GenerateNonce()
   param_ent.Prepay_id = pret.Prepay_id
   param_ent.Package = "prepay_id=" + pret.Prepay_id
   param_ent.SignType = "RSA"
   param_ent.PaySign, _ = param_ent.GenPaySignV3(ent.MchPrivateKey)
   return param_ent, nil
}

到了这里,关于微信小程序开发实战11_1 微信支付下单的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【小程序】零基础微信小程序开发+实战项目

    如何拥有一款属于你自己的小程序,惊喜就在下面! 目前,小程序行业已经成为互联网营销的热门黑马之一,依托于各大流量平台,小程序行业具有天然的用户基础和得天独厚的资源优势,凭借其方便快捷的操作以及简单通俗的模式,仅短短一年的时间,就迎来了爆发性的增

    2024年02月11日
    浏览(50)
  • 微信小程序开发15 项目实战 基于云开发开发一个在线商城小程序

    在学完前 4 个模块之后,我相信你会对微信小程序的开发有一个全新的认识。在前面 3 个模块中,俊鹏分别从微信小程序内在的运行原理,小程序工程化开发以及具体实践层面,深度讲解了微信小程序开发所必要的知识和能力。而第 4 个模块里,我带你认识了微信小程序的云

    2024年02月11日
    浏览(57)
  • 微信小程序开发入门与实战 ①(初始微信小程序)

    @作者 : SYFStrive   @博客首页 : HomePage 📜: 微信小程序 📌: 个人社区(欢迎大佬们加入) 👉: 社区链接🔗 📌: 觉得文章不错可以点点关注 👉: 微信小程序专栏🔗 💃: 感谢支持,学累了可以先看小段由小胖给大家带来的街舞😀 🔗: 阅读文章 👉 微信小程序 (🔥)

    2024年02月09日
    浏览(111)
  • 微信小程序实战:智能水印相机小程序开发附源码

    一款智能水印相机,拍照自动添加时间、地点、经纬度等水印文字,可用于工作考勤、学习打卡、工作取证等,支持自定义内容以及给现有照片添加水印。无需安装,无需注册,即开即用。 主要是通过canvas给图片上添加上时间水印地点信息。首先通过官方API(chooseLocation)获取

    2024年02月09日
    浏览(67)
  • 微信小程序开发实战9_2 小程序页面转发

    小程序页面转发是小程序分享的一个重要方式,在设计小程序应用时就需要考虑那些页面需要实现转发功能,以及页面的转发参数。本节介绍如何进行小程序页面的分享,并介绍如何获取小程序卡片的分享票据。 9.2.1小程序页面转发 微信小程序提供了页面的转发的功能,用户

    2024年02月16日
    浏览(44)
  • (后续更新)【微信小程序】毕业设计 租房小程序开发实战,零基础开发房屋租赁系统小程序

    大家好,我是子木。 以前没接触过小程序,刚好毕业设计选题选到了小程序,有前端基础,于是在提交完开题后开始自学小程序(云开发),属于边学边开发的那种。缝缝补补,最终耗时1个多月写完了我的课题。 这段时间刚写完论文比较闲,所以来记录一下自己的开发过程

    2024年02月11日
    浏览(71)
  • Taro 小程序开发大型实战(七):尝鲜微信小程序云(下篇)

    欢迎继续阅读《Taro 小程序开发大型实战》系列,前情回顾: 熟悉的 React,熟悉的 Hooks:我们用 React 和 Hooks 实现了一个非常简单的添加帖子的原型 多页面跳转和 Taro UI 组件库:我们用 Taro 自带的路由功能实现了多页面跳转,并用 Taro UI 组件库升级了应用界面 实现微信和支付

    2024年03月10日
    浏览(54)
  • 支付宝小程序开发踩坑笔记(支付宝、学习强国小程序)

    1、接口请求安卓端回调 success ,IOS 端回调 fail 原因: dataType 设置不对,默认是 json 格式,对返回数据会进行 json 解析,如果解析失败,就会回调 fail 。加密传输一般是 text 格式。 2、input 禁止输入空格 input 、 textarea 组件默认不会双向绑定,需要借助 setData 进行中转。 如果

    2024年01月25日
    浏览(44)
  • uniapp(微信小程序/支付宝小程序) - 最新解决canavs绘制海报、二维码图片等不显示问题,在uniapp小程序开发中使用canavs制作base64图片在真机运行时空白不显示(详细解决方法)

    在uniapp微信小程序 | uniapp支付宝小程序中,详解canavs技术绘制图像后在真实手机上运行不显示的问题,解决uniapp安卓苹果ios运行小程序后二维码/海报无法加载和展示,完美解决兼容问题、图片太大画不出来、加载失败等。支持保存到相册中或长按保存。 很多教程都无效,本

    2024年04月25日
    浏览(53)
  • 微信小程序 | 小程序开发

    🖥️ 微信小程序专栏:小程序开发 初级知识 🧑‍💼 个人简介:一个不甘平庸的平凡人🍬 ✨ 个人主页:CoderHing的个人主页 🍀 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀️ 👉 你的一键三连是我更新的最大动力❤️ 目录 一、认识小程序开发 什么是小程序? 各个平台小

    2024年01月24日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包