golang微信支付介绍

本次只介绍单个普通商户支付功能

下载微信提供的第三方包wechatpay-go

下载地址

https://github.com/wechatpay-apiv3/wechatpay-go

支付接口文档

微信支付-普通下单开发者文档

由于我下载的是V2,由于和第一版有差异,文件名有修改

github.com/wechatpay-apiv3/wechatpay-go-0.2

商户平台--证书密钥信息

登录到微信支付-商户平台,到账户中心-API安全,做API证书申请、APIv3密钥设置;API密钥没有设置,暂时也没有了解过

商户平台--jsapi设置

登录到微信支付-商户平台,到产品中心-开发配置,设置支付成功回调服务器域名。由于开发期间可能需要用到自己电脑调试,或有自己的域名可设置指定,若没有,可使用钉钉内容穿透等工具

商户平台--appid

Appid,使用商户平台注册时绑定的公众号,或是小程序对应的appid。Mchid即是商户平台的商户号

jsapi调起支付

先设置需要有固定参数值

Appid:开发的程序,公众号、小程序

Mchid:商户号

ServerURL:支付回调服务器地址

MchAPIv3Key:商户设置APIv3时,自己定义的密钥

MchCertificateSerialNumber:商户证书申请后,可查看到对应的序列号

MchPKFileName:下载的证书文件(路径)

//获取加解密处理
func getWechatClient() (context.Context,*core.Client, error) {// 使用 utils 提供的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名mchPrivateKey, err := payUtils.LoadPrivateKeyWithPath(MchPKFileName)if err != nil {log.Print("load merchant private key error")return nil,nil, err}ctx := context.Background()// 使用商户私钥等初始化 client,并使它具有自动定时获取微信支付平台证书的能力opts := []core.ClientOption{option.WithWechatPayAutoAuthCipher(Mchid, MchCertificateSerialNumber, mchPrivateKey, MchAPIv3Key),}client, err := core.NewClient(ctx, opts...)if err != nil {log.Printf("new wechat pay client err:%s", err)return nil,nil, err}return ctx,client, nil
}

根据参数,生成微信预付订单,返回PrepayId,根据PrepayId前台即可调起支付,但前台仍需要加密,可使用另一个函数


func CreateWechatPrepayBill(outTradeNo, description, attach, spOpenid string, amount int64) (string, error) {notifyUrl := ServerURL +"/api/thirdParty/wechat/pay/getPayResult/"ctx,client, err := getWechatClient()if err != nil {log.Printf("new wechat pay client err:%s", err)return "",err}tmp, _ := time.ParseDuration("5m")endTime := time.Now().Add(tmp)svc := pjs.JsapiApiService{Client: client}resp, result, err := svc.Prepay(ctx,pjs.PrepayRequest{Appid:         core.String(Appid),Mchid:         core.String(Mchid),Description:   core.String(description),OutTradeNo:    core.String(outTradeNo),TimeExpire:    core.Time(endTime),Attach:        core.String(attach),NotifyUrl:     core.String(notifyUrl),GoodsTag:      core.String("WXG"),LimitPay:      []string{"no_credit"},SupportFapiao: core.Bool(false),Amount: &pjs.Amount{Currency: core.String("CNY"),Total:    core.Int64(amount),},Payer: &pjs.Payer{Openid: core.String(spOpenid),},SettleInfo: &pjs.SettleInfo{ProfitSharing: core.Bool(false),},},)if err != nil {// 处理错误log.Printf("call Prepay err:%s", err)return "", nil} else {// 处理返回结果log.Printf("status=%d resp=%s", result.Response.StatusCode, resp)}return *resp.PrepayId, nil
}

创建预付订单,并生成前端调起支付时的所有数据

//创建并生成待支付信息
func CreateWechatPrepayWithPayment(outTradeNo, description, attach, spOpenid string, amount int64)(map[string]interface{}, error){notifyUrl := ServerURL +"/api/thirdParty/wechat/pay/getPayResult"ctx,client, err := getWechatClient()if err != nil {return nil,err}tmp, _ := time.ParseDuration("5m")endTime := time.Now().Add(tmp)svc := pjs.JsapiApiService{Client: client}resp, _, err := svc.PrepayWithRequestPayment(ctx,pjs.PrepayRequest{Appid:         core.String(Appid),Mchid:         core.String(Mchid),Description:   core.String(description),OutTradeNo:    core.String(outTradeNo),TimeExpire:    core.Time(endTime),Attach:        core.String(attach),NotifyUrl:     core.String(notifyUrl),GoodsTag:      core.String("WXG"),LimitPay:      []string{"no_credit"},SupportFapiao: core.Bool(false),Amount: &pjs.Amount{Currency: core.String("CNY"),Total:    core.Int64(amount),},Payer: &pjs.Payer{Openid: core.String(spOpenid),},SettleInfo: &pjs.SettleInfo{ProfitSharing: core.Bool(false),},},)if err != nil {// 处理错误return nil, err} else {// 处理返回结果//log.Printf("status=%d resp=%s", result.Response.StatusCode, resp)}result := make(map[string]interface{})tmpJson := utils.GetJsonStr(resp)json.Unmarshal([]byte(tmpJson),&result)return result, nil
}

支付回调

回调处理有两种,

第1:当你的回调接口是原生接口,即在回调的函数里之前还未使用ioutil.ReadAll(request.Body)获取返回数据时,可使用第三方包附带的函数

func getPayResult(param map[string]interface{}, w http.ResponseWriter, r *http.Request) (interface{}, int32) {fmt.Println("微信支付回调")handler := notify.NewNotifyHandler(pay.MchAPIv3Key, verifiers.NewSHA256WithRSAVerifier(core.NewCertificateMapWithList(nil)),)content := make(map[string]interface{})request, err := handler.ParseNotifyRequest(context.Background(), r, content)utils.ThrowError(err)fmt.Println(request)fmt.Println(content)return "success", 0
}

但,当你的回调接口是有自行封装过,即在到你的处理函数前,已有执行过ioutil.ReadAll(request.Body),则无法使用第三方包函数,需要自己处理解密和判断

if fmt.Sprint(vals["event_type"]) == "TRANSACTION.SUCCESS" {fmt.Println("微信支付成功")resourceObj := vals["resource"].(map[string]interface{})nonce := fmt.Sprint(resourceObj["nonce"])associated_data := fmt.Sprint(resourceObj["associated_data"])ciphertext := fmt.Sprint(resourceObj["ciphertext"])certificate, err := payUtils.DecryptAES256GCM(pay.MchAPIv3Key, associated_data, nonce, ciphertext)logs.Info("回调函数内容", certificate)if err != nil {logs.Info("解密错误原因", err)}certificateObj := utils.JsonForceMashMap(certificate)attach := fmt.Sprint(certificateObj["attach"])fmt.Println("attach", attach)tmp := make(map[string]interface{})tmp["code"] = "SUCCESS"tmp["message"] = "成功"return tmp, 40} else {fmt.Println("微信支付失败")tmp := make(map[string]interface{})tmp["code"] = "500"tmp["message"] = "失败"return tmp, 40
}

第2,使用包里自带的处理函数函数payUtils.DecryptAES256GCM

func getPayResult(param map[string]interface{}, w http.ResponseWriter, r *http.Request) (interface{}, int32) {defer func() {//错误处理if e := recover(); e != nil {logs.Error("微信支付回调异常:",e)}}()logs.Info("微信支付回调:",param)request := notify.Request{}tools.MapToSturct(param, &request)if request.EventType == "TRANSACTION.SUCCESS" {plaintext, err := payUtils.DecryptAES256GCM(wechatPay.MchAPIv3Key, request.Resource.AssociatedData, request.Resource.Nonce, request.Resource.Ciphertext,)utils.ThrowError(err)transaction := payments.Transaction{}tools.JsonStrToStruct(plaintext, &transaction)logs.Info("微信支付成功:",transaction)/*数据处理*///微信支付回调返回特殊处理,Flag = 40tmp := make(map[string]interface{})tmp["code"] = "SUCCESS"tmp["message"] = "成功"return tmp, 40} else {fmt.Println("微信支付失败")logs.Error("微信支付失败",request.Summary)tmp := make(map[string]interface{})tmp["code"] = "500"tmp["message"] = "失败"return tmp, 40}
}

转到到零钱设置

转账到零钱需要到 产品中心-转账到零钱-产品设置 中设置对应提现IP才可使用

  1. 转账到零钱需要到 产品中心-转账到零钱-产品设置 中设置对应提现IP才可使用

golang 微信支付介绍相关推荐

  1. 一、微信支付介绍和接入指引

    目录 一.微信支付介绍和接入指引 1.微信支付产品介绍 1.1.付款码支付 1.2.JSAPI支付 1.3.小程序支付 1.4.Native支付 1.5.APP支付 1.6.刷脸支付 1.7.申请费用 ...

  2. golang 微信支付全解析

    由于项目需要,对接了一下最新的apiv3版的微信支付,花了不少时间,为避免大家走弯路,把详细的对接过程给大家分析一下. 首先上官网开发者文档copy一下代码!由于我们这次接通的是小程序的支付,所以基本 ...

  3. Spring Boot版微信支付教程(视频 源码笔记)

    最近有读者让我找点 [微信支付,视频课程]已将帮忙找到了,这次免费分享出来,也希望大家不要嫌弃! 70讲:SpringBoot项目的在线微信支付实战 核心模块: 接入指引,支付安全,创建项目,实战下单 ...

  4. 尚医通 (三十六) --------- 微信支付

    目录 一.微信支付介绍 二.微信支付开发 1. api 接口 2. 前端 3. 处理支付结果 三.取消预约 1. 需求描述 2. 开发微信退款接口 3. 前端 一.微信支付介绍 A.微信扫码支付申请 ...

  5. 微信支付、公众号支付、微信APP支付教程

    这两天有朋友问我微信支付的一些事情,我就抽了点时间整理了一下微信支付相关的一些东西,在这里分享给大家,希望能帮助大家少走弯路. 微信支付分为APP支付和公众号支付两大类,其中公众号支付又分为(公众号支 ...

  6. SpringBoot整合微信支付开发在线教育视频网站(完整版)

    目录 ├─code.zip ├─第 1 章项目介绍和前期准备 │  ├─1-1 SpringBoot整合微信支付开发在线教育视频站点介绍.TS │  ├─1-2 中大型公司里面项目开发流程讲解.TS ...

  7. 微信支付-全面详解(学习总结---从入门到深化)

    微信支付_产品介绍 微信支付介绍 微信支付(https://pay.weixin.qq.com)是腾讯集团旗下中国领先 的第三方支付平台,一直致力于为用户和企业提供安全.便捷.专业的在线支付服务. 付 ...

  8. 17 医疗挂号系统_【微信支付】

    一.微信支付介绍 1微信扫码支付申请 微信扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信"扫一扫"完成支付的模式.该模式适用于PC网站支付.实体店单品或订单支付.媒体 ...

  9. 微信支付(p1-p10)

    微信支付(p1-p10) 文章目录 微信支付(p1-p10) 1.介绍 2.微信支付产品介绍 3.获取商户号 4.绑定场景 5.获取密钥和证书 6.知识总结 7.对称加密和非对称加密 8.身份认证 9 ...

最新文章

  1. Laravel 7发行说明
  2. 线程池 And 线程池的使用(基于.net平台)
  3. 第六届 蓝桥杯 省赛 Java B组 牌型总数
  4. mysql哪些_初学MySQL哪些需要你知道
  5. Nagios 请检查HTTP服务器关于该CGI的访问权限设置
  6. JavaWeb——c:forEach varStatus=status
  7. hbase里插入big int数据用Phoenix查看的报错问题
  8. mysql数据库安装,真香!
  9. java自定义变量解析,Thymeleaf内置对象、定义变量、URL参数及标签自定义属性
  10. 看视频学编程之最最基础的基础(1)
  11. 帆软助力惠科集团产值提升1%以上,带来上亿元数据价值
  12. 关于MVC与三层架构
  13. traefik 结合 docker-compose 的快速安装及使用
  14. AI2(App Inventor 2)离线版服务器单机版
  15. python打包成exe文件
  16. 系泊系统悬链线matlab,系泊系统的设计.docx
  17. 报错 | Cannot find module ‘@better-scroll/core/dist/types/BScroll‘
  18. Python开发网站步骤
  19. 自己手动编译mpc-hc播放器
  20. 大一新生能从ACM比赛中得到什么?

热门文章

  1. latex排版——博雅编辑室
  2. 与安装应用签名不同怎么解决_手动签名安装掉证书应用、多开任意应用教程
  3. 【Re-ID】现有方法调研 - 无监督/半监督方法 - 其他方法
  4. STM32踩坑1-SWD下载失败
  5. spreadsheet属性方法事件
  6. Poco访问mysql
  7. 一.对于crc校验的流程演示说明。
  8. sshd:root@notty: linux 被暴力登录处理
  9. NSMutableAttributedString
  10. html如何让文字图片同高,css里图片和文字如何等高