Skip to content

Commit

Permalink
增加现金红包
Browse files Browse the repository at this point in the history
  • Loading branch information
pyihe committed Jul 15, 2020
1 parent dec65f5 commit 63e1030
Show file tree
Hide file tree
Showing 2 changed files with 225 additions and 0 deletions.
8 changes: 8 additions & 0 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,14 @@ type WePayer interface {
//分账动帐通知(此处无视返回结果的层级关系,对需要的字段直接使用Get方法获取对应的结果)
ProfitSharingNotify(body io.Reader) (ResultParam, error)

//红包相关
//发放红包
SendRedPack(param Param, p12CertPath string) (ResultParam, error)
//发放裂变红包
SendGroupRedPack(param Param, p12CertPath string) (ResultParam, error)
//查询红包发放记录
GetRedPackRecords(param Param, p12CertPath string) (ResultParam, error)

//小程序相关
//获取授权access_token
GetAccessTokenForMini() (Param, error) //获取小程序接口凭证,使用者自己保存token,过期重新获取
Expand Down
217 changes: 217 additions & 0 deletions redpack.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,217 @@
package wechat_sdk

import (
"errors"
"github.com/pyihe/wechat-sdk/pkg/e"
"github.com/pyihe/wechat-sdk/pkg/util"
)

func (m *myPayer) SendRedPack(param Param, p12CertPath string) (ResultParam, error) {
if param == nil {
return nil, e.ErrParams
}
if err := m.checkForPay(); err != nil {
return nil, err
}

//读取证书
cert, err := util.P12ToPem(p12CertPath, m.mchId)
if err != nil {
return nil, err
}

param.Add("wxappid", m.appId)
param.Add("mch_id", m.mchId)

var (
mustParam = []string{"nonce_str", "sign", "mch_billno", "mch_id", "wxappid", "send_name", "re_openid", "total_amount", "total_num", "wishing", "client_ip", "act_name", "remark"}
optionalParam = []string{"scene_id", "risk_info"}
signType = e.SignTypeMD5
)

for _, v := range mustParam {
if v == "sign" {
continue
}
if _, ok := param[v]; !ok {
return nil, errors.New("need param: " + v)
}
}

for key := range param {
if !util.HaveInArray(mustParam, key) && !util.HaveInArray(optionalParam, key) {
return nil, errors.New("no need param: " + key)
}
}
sign := param.Sign(signType)
param.Add("sign", sign)

reader, err := param.MarshalXML()
if err != nil {
return nil, err
}

var request = &postRequest{
Body: reader,
Url: "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack",
ContentType: e.PostContentType,
}
response, err := postToWxWithCert(request, cert)
if err != nil {
return nil, err
}
defer response.Body.Close()
result := ParseXMLReader(response.Body)
if returnCode, _ := result.GetString("return_code"); returnCode != "SUCCESS" {
returnMsg, _ := result.GetString("return_msg")
return nil, errors.New(returnMsg)
}
if resultCode, _ := result.GetString("result_code"); resultCode != "SUCCESS" {
errDes, _ := result.GetString("err_code_des")
return nil, errors.New(errDes)
}
sign = result.Sign(signType)
if resultSign, _ := result.GetString("sign"); resultSign != sign {
return nil, e.ErrCheckSign
}
return result, nil
}

func (m *myPayer) SendGroupRedPack(param Param, p12CertPath string) (ResultParam, error) {
if param == nil {
return nil, e.ErrParams
}
if err := m.checkForPay(); err != nil {
return nil, err
}

//读取证书
cert, err := util.P12ToPem(p12CertPath, m.mchId)
if err != nil {
return nil, err
}

param.Add("wxappid", m.appId)
param.Add("mch_id", m.mchId)

var (
mustParam = []string{"nonce_str", "sign", "mch_billno", "mch_id", "wxappid", "send_name", "re_openid", "total_amount", "total_num", "amt_type", "wishing", "act_name", "remark"}
optionalParam = []string{"scene_id", "risk_info"}
signType = e.SignTypeMD5
)

for _, v := range mustParam {
if v == "sign" {
continue
}
if _, ok := param[v]; !ok {
return nil, errors.New("need param: " + v)
}
}

for key := range param {
if !util.HaveInArray(mustParam, key) && !util.HaveInArray(optionalParam, key) {
return nil, errors.New("no need param: " + key)
}
}
sign := param.Sign(signType)
param.Add("sign", sign)

reader, err := param.MarshalXML()
if err != nil {
return nil, err
}

var request = &postRequest{
Body: reader,
Url: "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack",
ContentType: e.PostContentType,
}
response, err := postToWxWithCert(request, cert)
if err != nil {
return nil, err
}
defer response.Body.Close()
result := ParseXMLReader(response.Body)
if returnCode, _ := result.GetString("return_code"); returnCode != "SUCCESS" {
returnMsg, _ := result.GetString("return_msg")
return nil, errors.New(returnMsg)
}
if resultCode, _ := result.GetString("result_code"); resultCode != "SUCCESS" {
errDes, _ := result.GetString("err_code_des")
return nil, errors.New(errDes)
}
sign = result.Sign(signType)
if resultSign, _ := result.GetString("sign"); resultSign != sign {
return nil, e.ErrCheckSign
}
return result, nil
}

func (m *myPayer) GetRedPackRecords(param Param, p12CertPath string) (ResultParam, error) {
if param == nil {
return nil, e.ErrParams
}
if err := m.checkForPay(); err != nil {
return nil, err
}

//读取证书
cert, err := util.P12ToPem(p12CertPath, m.mchId)
if err != nil {
return nil, err
}

param.Add("appid", m.appId)
param.Add("mch_id", m.mchId)

var (
mustParam = []string{"nonce_str", "sign", "mch_billno", "mch_id", "appid", "bill_type"}
signType = e.SignTypeMD5
)
for _, v := range mustParam {
if v == "sign" {
continue
}
if _, ok := param[v]; !ok {
return nil, errors.New("need param: " + v)
}
}
for key := range param {
if !util.HaveInArray(mustParam, key) {
return nil, errors.New("no need param: " + key)
}
}
sign := param.Sign(signType)
param.Add("sign", sign)

reader, err := param.MarshalXML()
if err != nil {
return nil, err
}

var request = &postRequest{
Body: reader,
Url: "https://api.mch.weixin.qq.com/mmpaymkttransfers/gethbinfo",
ContentType: e.PostContentType,
}
response, err := postToWxWithCert(request, cert)
if err != nil {
return nil, err
}
defer response.Body.Close()
result := ParseXMLReader(response.Body)
if returnCode, _ := result.GetString("return_code"); returnCode != "SUCCESS" {
returnMsg, _ := result.GetString("return_msg")
return nil, errors.New(returnMsg)
}
if resultCode, _ := result.GetString("result_code"); resultCode != "SUCCESS" {
errDes, _ := result.GetString("err_code_des")
return nil, errors.New(errDes)
}
sign = result.Sign(signType)
if resultSign, _ := result.GetString("sign"); resultSign != sign {
return nil, e.ErrCheckSign
}
return result, nil
}

0 comments on commit 63e1030

Please sign in to comment.