From 5fe99bbabea58a41b3ce66ab2913b72ae749854d Mon Sep 17 00:00:00 2001 From: qingwuguo Date: Sun, 13 Jan 2019 15:49:36 +0800 Subject: [PATCH] docs --- README.md | 154 ++++++++++++++++++++++++++++++++++++++++++++------- bank/bank.go | 4 +- 2 files changed, 135 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index a945566..26396ad 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # PayJS SDK for Go +[![Go Report Card](https://goreportcard.com/badge/github.com/qingwg/payjs)](https://goreportcard.com/report/github.com/qingwg/payjs) + 使用Golang开发的PayJS SDK,简单、易用。 @@ -55,14 +57,25 @@ Pay = payjs.New(payjsConfig) ## 扫码支付 下面的是伪代码,请自行理解 ```go -PayNative := Pay.GetNative() type Request struct { TotalFee int `json:"total_fee"` //Y 金额。单位:分 Body string `json:"body"` //N 订单标题 Attach string `json:"attach"` //N 用户自定义数据,在notify的时候会原样返回 OutTradeNo string `json:"out_trade_no"` //Y 用户端自主生成的订单号 } -PayNative.Create(Request.TotalFee, Request.Body, Request.OutTradeNo, Request.Attach) +type Response struct { + ReturnCode int `json:"return_code"` //Y 1:请求成功,0:请求失败 + Msg string `json:"msg"` //N return_code为0时返回的错误消息 + ReturnMsg string `json:"return_msg"` //Y 返回消息 + PayJSOrderID string `json:"payjs_order_id"` //Y PAYJS 平台订单号 + OutTradeNo string `json:"out_trade_no"` //Y 用户生成的订单号原样返回 + TotalFee int `json:"total_fee"` //Y 金额。单位:分 + Qrcode string `json:"qrcode"` //Y 二维码图片地址 + CodeUrl string `json:"code_url"` //Y 可将该参数生成二维码展示出来进行扫码支付 + Sign string `json:"sign"` //Y 数据签名 详见签名算法 +} +PayNative := Pay.GetNative() +Response, err := PayNative.Create(Request.TotalFee, Request.Body, Request.OutTradeNo, Request.Attach) ``` 官方文档:[扫码支付 @@ -71,7 +84,6 @@ PayNative.Create(Request.TotalFee, Request.Body, Request.OutTradeNo, Request.Att ## 付款码支付(未测试) 下面的是伪代码,请自行理解 ```go -PayMicropay := Pay.GetMicropay() type Request struct { TotalFee int `json:"total_fee"` //Y 金额。单位:分 Body string `json:"body"` //N 订单标题 @@ -79,7 +91,17 @@ type Request struct { OutTradeNo string `json:"out_trade_no"` //Y 用户端自主生成的订单号 AuthCode string `json:"auth_code"` //Y 扫码支付授权码,设备读取用户微信中的条码或者二维码信息(注:用户刷卡条形码规则:18位纯数字,以10、11、12、13、14、15开头) } -PayMicropay.Create(Request.TotalFee, Request.Body, Request.OutTradeNo, Request.Attach, Request.AuthCode) +type Response struct { + ReturnCode int `json:"return_code"` //Y 1:请求成功,0:请求失败 + Msg string `json:"msg"` //N return_code为0时返回的错误消息 + ReturnMsg string `json:"return_msg"` //Y 返回消息 + PayJSOrderID string `json:"payjs_order_id"` //Y PAYJS 平台订单号 + OutTradeNo string `json:"out_trade_no"` //Y 用户生成的订单号原样返回 + TotalFee int `json:"total_fee"` //Y 金额。单位:分 + Sign string `json:"sign"` //Y 数据签名 详见签名算法 +} +PayMicropay := Pay.GetMicropay() +Response, err := PayMicropay.Create(Request.TotalFee, Request.Body, Request.OutTradeNo, Request.Attach, Request.AuthCode) ``` 官方文档:[付款码支付 @@ -88,7 +110,6 @@ PayMicropay.Create(Request.TotalFee, Request.Body, Request.OutTradeNo, Request.A ## 收银台支付 下面的是伪代码,请自行理解 ```go -PayCashier := Pay.GetCashier() type Request struct { TotalFee int `json:"total_fee"` //Y 金额。单位:分 Body string `json:"body"` //N 订单标题 @@ -98,7 +119,8 @@ type Request struct { Auto bool `json:"auto"` //N auto=1:无需点击支付按钮,自动发起支付。默认手动点击发起支付 Hide bool `json:"hide"` //N hide=1:隐藏收银台背景界面。默认显示背景界面(这里hide为1时,自动忽略auto参数) } -PayCashier.GetRequestUrl(Request.TotalFee, Request.Body, Request.OutTradeNo, Request.Attach, Request.CallbackUrl, Request.Auto, Request.Hide) +PayCashier := Pay.GetCashier() +requestUrl, err := PayCashier.GetRequestUrl(Request.TotalFee, Request.Body, Request.OutTradeNo, Request.Attach, Request.CallbackUrl, Request.Auto, Request.Hide) ``` 官方文档:[收银台支付 @@ -107,7 +129,6 @@ PayCashier.GetRequestUrl(Request.TotalFee, Request.Body, Request.OutTradeNo, Req ## JSAPI支付(未测试)(有bug) 下面的是伪代码,请自行理解 ```go -PayJS := Pay.GetJs() type Request struct { TotalFee int `json:"total_fee"` //Y 金额。单位:分 OutTradeNo string `json:"out_trade_no"` //Y 用户端自主生成的订单号,在用户端要保证唯一性 @@ -115,7 +136,15 @@ type Request struct { Attach string `json:"attach"` //N 用户自定义数据,在notify的时候会原样返回 Openid string `json:"openid"` //Y 用户openid } -PayJS.Create(Request.TotalFee, Request.Body, Request.OutTradeNo, Request.Attach, Request.Openid) +type Response struct { + ReturnCode int `json:"return_code"` //Y 0:失败 1:成功 + ReturnMsg string `json:"return_msg"` //Y 失败原因 + PayJSOrderID string `json:"payjs_order_id"` //Y PAYJS 侧订单号 + JsApi JsApi `json:"jsapi"` //N 用于发起支付的支付参数 + Sign string `json:"sign"` //Y 数据签名 +} +PayJS := Pay.GetJs() +Response, err := PayJS.Create(Request.TotalFee, Request.Body, Request.OutTradeNo, Request.Attach, Request.Openid) ``` 官方文档:[JSAPI支付 @@ -129,7 +158,6 @@ PayJS.Create(Request.TotalFee, Request.Body, Request.OutTradeNo, Request.Attach, - 方案一:使用小程序消息,结合收银台模式,可以解决小程序支付 - 方案二:使用小程序跳转到 PAYJS 小程序,支付后返回(下面代码是方案二) ```go -PayMiniApp := Pay.GetMiniApp() type Request struct { TotalFee int `json:"total_fee"` //Y 金额。单位:分 OutTradeNo string `json:"out_trade_no"` //Y 用户端自主生成的订单号,在用户端要保证唯一性 @@ -137,8 +165,19 @@ type Request struct { Attach string `json:"attach"` //N 用户自定义数据,在notify的时候会原样返回 Nonce string `json:"nonce"` //Y 随机字符串 } +type Response struct { + MchID string `json:"mch_id"` //Y 商户号 + TotalFee int `json:"total_fee"` //Y 金额。单位:分 + OutTradeNo string `json:"out_trade_no"` //Y 用户端自主生成的订单号 + Body string `json:"body"` //N 订单标题 + Attach string `json:"attach"` //N 用户自定义数据,在notify的时候会原样返回 + NotifyUrl string `json:"notify_url"` //N 异步通知地址 + Nonce string `json:"nonce"` //Y 随机字符串 + Sign string `json:"sign"` //Y 数据签名 详见签名算法 +} +PayMiniApp := Pay.GetMiniApp() // 获取小程序跳转所需的参数 -PayMiniApp.GetOrderInfo(Request.TotalFee, Request.Body, Request.OutTradeNo, Request.Attach, Request.Nonce) +Response, err := PayMiniApp.GetOrderInfo(Request.TotalFee, Request.Body, Request.OutTradeNo, Request.Attach, Request.Nonce) ``` 官方文档:[小程序支付 @@ -147,7 +186,6 @@ PayMiniApp.GetOrderInfo(Request.TotalFee, Request.Body, Request.OutTradeNo, Requ ## 人脸支付(未测试) 下面的是伪代码,请自行理解 ```go -PayFacepay := Pay.GetFacepay() type Request struct { TotalFee int `json:"total_fee"` //Y 金额。单位:分 OutTradeNo string `json:"out_trade_no"` //Y 用户端自主生成的订单号,在用户端要保证唯一性 @@ -156,7 +194,17 @@ type Request struct { Openid string `json:"openid"` //Y OPENID FaceCode string `json:"face_code"` //Y 人脸支付识别码 } -PayFacepay.Create(Request.TotalFee, Request.Body, Request.OutTradeNo, Request.Attach, Request.Openid, Request.FaceCode) +type Response struct { + ReturnCode int `json:"return_code"` //Y 1:请求成功,0:请求失败 + Msg string `json:"msg"` //N return_code为0时返回的错误消息 + ReturnMsg string `json:"return_msg"` //Y 返回消息 + PayJSOrderID string `json:"payjs_order_id"` //Y PAYJS 平台订单号 + OutTradeNo string `json:"out_trade_no"` //Y 用户生成的订单号原样返回 + TotalFee string `json:"total_fee"` //Y 金额。单位:分 + Sign string `json:"sign"` //Y 数据签名 详见签名算法 +} +PayFacepay := Pay.GetFacepay() +Response, err := PayFacepay.Create(Request.TotalFee, Request.Body, Request.OutTradeNo, Request.Attach, Request.Openid, Request.FaceCode) ``` 官方文档:[人脸支付 @@ -174,7 +222,20 @@ PayOrder := Pay.GetOrder() type Request struct { PayJSOrderID string `json:"payjs_order_id"` //Y PAYJS 平台订单号 } -PayOrder.Check(Request.PayJSOrderID) +type Response struct { + ReturnCode int `json:"return_code"` //Y 1:请求成功 0:请求失败 + MchID string `json:"mchid"` //Y PAYJS 平台商户号 + OutTradeNo string `json:"out_trade_no"` //Y 用户端订单号 + PayJSOrderID string `json:"payjs_order_id"` //Y PAYJS 订单号 + TransactionID string `json:"transaction_id"` //N 微信显示订单号 + Status int `json:"status"` //Y 0:未支付,1:支付成功 + Openid string `json:"openid"` //N 用户 OPENID + TotalFee int `json:"total_fee"` //N 订单金额 + PaidTime string `json:"paid_time"` //N 订单支付时间 + Attach string `json:"attach"` //N 用户自定义数据 + Sign string `json:"sign"` //Y 数据签名 详见签名算法 +} +Response, err := PayOrder.Check(Request.PayJSOrderID) ``` 官方文档:[订单-查询 ](https://help.payjs.cn/api-lie-biao/ding-dan-cha-xun.html) @@ -184,7 +245,13 @@ PayOrder.Check(Request.PayJSOrderID) type Request struct { PayJSOrderID string `json:"payjs_order_id"` //Y PAYJS 平台订单号 } -PayOrder.Close(Request.PayJSOrderID) +type Response struct { + ReturnCode int `json:"return_code"` //Y 1:请求成功 0:请求失败 + ReturnMsg string `json:"return_msg"` //Y 返回消息 + PayJSOrderID string `json:"payjs_order_id"` //Y PAYJS 平台订单号 + Sign string `json:"sign"` //Y 数据签名 详见签名算法 +} +Response, err := Response, err := PayOrder.Close(Request.PayJSOrderID) ``` 官方文档:[订单-关闭 ](https://help.payjs.cn/api-lie-biao/guan-bi-ding-dan.html) @@ -194,7 +261,13 @@ PayOrder.Close(Request.PayJSOrderID) type Request struct { PayJSOrderID string `json:"payjs_order_id"` //Y PAYJS 平台订单号 } -PayOrder.Reverse(Request.PayJSOrderID) +type Response struct { + ReturnCode int `json:"return_code"` //Y 1:请求成功 0:请求失败 + ReturnMsg string `json:"return_msg"` //Y 返回消息 + PayJSOrderID string `json:"payjs_order_id"` //Y PAYJS 平台订单号 + Sign string `json:"sign"` //Y 数据签名 详见签名算法 +} +Response, err := PayOrder.Reverse(Request.PayJSOrderID) ``` 官方文档:[订单-撤销 ](https://help.payjs.cn/api-lie-biao/che-xiao-ding-dan.html) @@ -204,7 +277,15 @@ PayOrder.Reverse(Request.PayJSOrderID) type Request struct { PayJSOrderID string `json:"payjs_order_id"` //Y PAYJS 平台订单号 } -PayOrder.Refund(Request.PayJSOrderID) +type Response struct { + ReturnCode int `json:"return_code"` //Y 1:请求成功 0:请求失败 + ReturnMsg string `json:"return_msg"` //Y 返回消息 + PayJSOrderID string `json:"payjs_order_id"` //Y PAYJS 平台订单号 + OutTradeNo string `json:"out_trade_no"` //N 用户侧订单号 + TransactionID string `json:"transaction_id"` //N 微信支付订单号 + Sign string `json:"sign"` //Y 数据签名 详见签名算法 +} +Response, err := PayOrder.Refund(Request.PayJSOrderID) ``` 官方文档:[订单-退款 ](https://help.payjs.cn/api-lie-biao/tui-kuan.html) @@ -212,6 +293,20 @@ PayOrder.Refund(Request.PayJSOrderID) ## 异步通知 下面的是伪代码,请自行理解 ```go +// Message PayJS支付成功异步通知过来的内容 +type Message struct { + ReturnCode int `json:"return_code"` // 必填 1:支付成功 + TotalFee int `json:"total_fee"` // 必填 金额。单位:分 + OutTradeNo string `json:"out_trade_no"` // 必填 用户端自主生成的订单号 + PayJSOrderID string `json:"payjs_order_id"` // 必填 PAYJS 订单号 + TransactionID string `json:"transaction_id"` // 必填 微信用户手机显示订单号 + TimeEnd string `json:"time_end"` // 必填 支付成功时间 + Openid string `json:"openid"` // 必填 用户OPENID标示,本参数没有实际意义,旨在方便用户端区分不同用户 + Attach string `json:"attach"` // 非必填 用户自定义数据 + MchID string `json:"mchid"` // 必填 PAYJS 商户号 + Sign string `json:"sign"` // 必填 数据签名 详见签名算法 +} + // 传入request和responseWriter PayNotify := Pay.GetNotify(request, responseWriter) @@ -247,7 +342,7 @@ PayUser := Pay.GetUser() type Request struct { CallbackUrl string `json:"callback_url"` //Y 接收 openid 的 url。必须为可直接访问的url,不能带session验证、csrf验证。url 可携带最多1个参数,多个参数会自动忽略 } -PayUser.GetUserOpenIDUrl(Request.CallbackUrl) +url, err := PayUser.GetUserOpenIDUrl(Request.CallbackUrl) ``` 官方文档:[用户-获取浏览器跳转的url ](https://help.payjs.cn/api-lie-biao/huo-qu-openid.html) @@ -255,7 +350,7 @@ PayUser.GetUserOpenIDUrl(Request.CallbackUrl) #### 获取openid ```go // 在callback_url方法内,传入request -PayUser.GetUserOpenID(request) +openid, err := PayUser.GetUserOpenID(request) ``` 官方文档:[用户-获取openid ](https://help.payjs.cn/api-lie-biao/huo-qu-openid.html) @@ -263,8 +358,19 @@ PayUser.GetUserOpenID(request) ## 商户资料(未测试)(有bug) 下面的是伪代码,请自行理解 ```go +type Response struct { + ReturnCode int `json:"return_code"` //Y 1:请求成功 0:请求失败 + ReturnMsg string `json:"return_msg"` //Y 返回消息 + Doudou int `json:"doudou"` //Y 用户豆豆数 + Name string `json:"name"` //Y 商户名称 + Username string `json:"username"` //Y 用户姓名 + IDcardNo string `json:"idcardno"` //Y 身份证号 + JsApiPath string `json:"jsapi_path"` //Y JSAPI 支付目录 + Phone string `json:"phone"` //Y 客服电话 + Sign string `json:"sign"` //Y 数据签名 详见签名算法 +} PayMch := Pay.GetMch() -PayMch.GetMchInfo() +Response, err := PayMch.GetMchInfo() ``` 官方文档:[商户资料 @@ -273,11 +379,17 @@ PayMch.GetMchInfo() ## 银行编码查询(未测试) 下面的是伪代码,请自行理解 ```go -PayBank := Pay.GetBank() type Request struct { Bank string `json:"bank"` //Y 银行简写 } -PayBank.GetBankInfo(Request.Bank) +type Response struct { + ReturnCode int `json:"return_code"` //Y 1:请求成功 0:请求失败 + ReturnMsg string `json:"return_msg"` //Y 返回消息 + Bank string `json:"bank"` //Y 银行名称 + Sign string `json:"sign"` //Y 数据签名 详见签名算法 +} +PayBank := Pay.GetBank() +Response, err := PayBank.GetBankInfo(Request.Bank) ``` 官方文档:[银行编码查询 diff --git a/bank/bank.go b/bank/bank.go index dfd275c..0eb190b 100644 --- a/bank/bank.go +++ b/bank/bank.go @@ -42,7 +42,7 @@ func (bank *Bank) GetBankInfo(bankReq string) (bankInfoResponse BankInfoResponse MchID: bank.MchID, Bank: bankReq, } - sign := util.Signature(bankInfoRequest, bank.Context.Key) + sign := util.Signature(bankInfoRequest, bank.Key) bankInfoRequest.Sign = sign response, err := util.PostJSON(getBankInfoURL, bankInfoRequest) if err != nil { @@ -58,7 +58,7 @@ func (bank *Bank) GetBankInfo(bankReq string) (bankInfoResponse BankInfoResponse } // 检测sign msgSignature := bankInfoResponse.Sign - msgSignatureGen := util.Signature(bankInfoResponse, bank.Context.Key) + msgSignatureGen := util.Signature(bankInfoResponse, bank.Key) if msgSignature != msgSignatureGen { err = fmt.Errorf("消息不合法,验证签名失败") return