Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
docs
  • Loading branch information
qingwg committed Jan 13, 2019
1 parent c6f2820 commit 5fe99bb
Show file tree
Hide file tree
Showing 2 changed files with 135 additions and 23 deletions.
154 changes: 133 additions & 21 deletions 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,简单、易用。

Expand Down Expand Up @@ -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)
```

官方文档:[扫码支付
Expand All @@ -71,15 +84,24 @@ 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 订单标题
Attach string `json:"attach"` //N 用户自定义数据,在notify的时候会原样返回
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)
```

官方文档:[付款码支付
Expand All @@ -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 订单标题
Expand All @@ -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)
```

官方文档:[收银台支付
Expand All @@ -107,15 +129,22 @@ 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 用户端自主生成的订单号,在用户端要保证唯一性
Body string `json:"body"` //N 订单标题
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支付
Expand All @@ -129,16 +158,26 @@ 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 用户端自主生成的订单号,在用户端要保证唯一性
Body string `json:"body"` //N 订单标题
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)
```

官方文档:[小程序支付
Expand All @@ -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 用户端自主生成的订单号,在用户端要保证唯一性
Expand All @@ -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)
```

官方文档:[人脸支付
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -204,14 +277,36 @@ 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)

## 异步通知
下面的是伪代码,请自行理解
```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)

Expand Down Expand Up @@ -247,24 +342,35 @@ 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)

#### 获取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)

## 商户资料(未测试)(有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()
```

官方文档:[商户资料
Expand All @@ -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)
```

官方文档:[银行编码查询
Expand Down
4 changes: 2 additions & 2 deletions bank/bank.go
Expand Up @@ -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 {
Expand All @@ -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
Expand Down

0 comments on commit 5fe99bb

Please sign in to comment.