From 63e10303b1ea366032c692146de917a29ea9ca8d Mon Sep 17 00:00:00 2001 From: hong <785131182@qq.com> Date: Wed, 15 Jul 2020 22:50:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=8E=B0=E9=87=91=E7=BA=A2?= =?UTF-8?q?=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client.go | 8 ++ redpack.go | 217 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 225 insertions(+) create mode 100644 redpack.go diff --git a/client.go b/client.go index 49c3aa3..55e8a64 100644 --- a/client.go +++ b/client.go @@ -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,过期重新获取 diff --git a/redpack.go b/redpack.go new file mode 100644 index 0000000..063665e --- /dev/null +++ b/redpack.go @@ -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 +} \ No newline at end of file