golang 微信支付介绍
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才可使用
- 转账到零钱需要到 产品中心-转账到零钱-产品设置 中设置对应提现IP才可使用
golang 微信支付介绍相关推荐
- 一、微信支付介绍和接入指引
目录 一.微信支付介绍和接入指引 1.微信支付产品介绍 1.1.付款码支付 1.2.JSAPI支付 1.3.小程序支付 1.4.Native支付 1.5.APP支付 1.6.刷脸支付 1.7.申请费用 ...
- golang 微信支付全解析
由于项目需要,对接了一下最新的apiv3版的微信支付,花了不少时间,为避免大家走弯路,把详细的对接过程给大家分析一下. 首先上官网开发者文档copy一下代码!由于我们这次接通的是小程序的支付,所以基本 ...
- Spring Boot版微信支付教程(视频 源码笔记)
最近有读者让我找点 [微信支付,视频课程]已将帮忙找到了,这次免费分享出来,也希望大家不要嫌弃! 70讲:SpringBoot项目的在线微信支付实战 核心模块: 接入指引,支付安全,创建项目,实战下单 ...
- 尚医通 (三十六) --------- 微信支付
目录 一.微信支付介绍 二.微信支付开发 1. api 接口 2. 前端 3. 处理支付结果 三.取消预约 1. 需求描述 2. 开发微信退款接口 3. 前端 一.微信支付介绍 A.微信扫码支付申请 ...
- 微信支付、公众号支付、微信APP支付教程
这两天有朋友问我微信支付的一些事情,我就抽了点时间整理了一下微信支付相关的一些东西,在这里分享给大家,希望能帮助大家少走弯路. 微信支付分为APP支付和公众号支付两大类,其中公众号支付又分为(公众号支 ...
- SpringBoot整合微信支付开发在线教育视频网站(完整版)
目录 ├─code.zip ├─第 1 章项目介绍和前期准备 │ ├─1-1 SpringBoot整合微信支付开发在线教育视频站点介绍.TS │ ├─1-2 中大型公司里面项目开发流程讲解.TS ...
- 微信支付-全面详解(学习总结---从入门到深化)
微信支付_产品介绍 微信支付介绍 微信支付(https://pay.weixin.qq.com)是腾讯集团旗下中国领先 的第三方支付平台,一直致力于为用户和企业提供安全.便捷.专业的在线支付服务. 付 ...
- 17 医疗挂号系统_【微信支付】
一.微信支付介绍 1微信扫码支付申请 微信扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信"扫一扫"完成支付的模式.该模式适用于PC网站支付.实体店单品或订单支付.媒体 ...
- 微信支付(p1-p10)
微信支付(p1-p10) 文章目录 微信支付(p1-p10) 1.介绍 2.微信支付产品介绍 3.获取商户号 4.绑定场景 5.获取密钥和证书 6.知识总结 7.对称加密和非对称加密 8.身份认证 9 ...
最新文章
- Laravel 7发行说明
- 线程池 And 线程池的使用(基于.net平台)
- 第六届 蓝桥杯 省赛 Java B组 牌型总数
- mysql哪些_初学MySQL哪些需要你知道
- Nagios 请检查HTTP服务器关于该CGI的访问权限设置
- JavaWeb——c:forEach varStatus=status
- hbase里插入big int数据用Phoenix查看的报错问题
- mysql数据库安装,真香!
- java自定义变量解析,Thymeleaf内置对象、定义变量、URL参数及标签自定义属性
- 看视频学编程之最最基础的基础(1)
- 帆软助力惠科集团产值提升1%以上,带来上亿元数据价值
- 关于MVC与三层架构
- traefik 结合 docker-compose 的快速安装及使用
- AI2(App Inventor 2)离线版服务器单机版
- python打包成exe文件
- 系泊系统悬链线matlab,系泊系统的设计.docx
- 报错 | Cannot find module ‘@better-scroll/core/dist/types/BScroll‘
- Python开发网站步骤
- 自己手动编译mpc-hc播放器
- 大一新生能从ACM比赛中得到什么?