You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
4.6 KiB
148 lines
4.6 KiB
package pay_service
|
|
|
|
import (
|
|
"encoding/xml"
|
|
"fmt"
|
|
"github.com/iGoogle-ink/gopay/v2"
|
|
"github.com/iGoogle-ink/gopay/v2/wechat"
|
|
"github.com/ouxuanserver/osmanthuswine/src/core"
|
|
"hudongzhuanjia/libs/wx"
|
|
"hudongzhuanjia/logger"
|
|
"hudongzhuanjia/models"
|
|
"time"
|
|
)
|
|
|
|
func TransferExtend(bm gopay.BodyMap) (*wechat.TransfersResponse, error) {
|
|
err := bm.CheckEmptyError("nonce_str", "partner_trade_no", "openid", "check_name", "amount", "desc", "spbill_create_ip")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
bs, err := ClientExtend(bm, wx.TransfersURL)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
wxRsp := new(wechat.TransfersResponse)
|
|
if err = xml.Unmarshal(bs, wxRsp); err != nil {
|
|
return nil, fmt.Errorf("xml.Unmarshal(%s):%s", string(bs), err)
|
|
}
|
|
return wxRsp, nil
|
|
}
|
|
|
|
// 企业向微信用户个人付款(不支持沙箱环境)
|
|
func Transfer(desc, ip, openId string, amount int) (*wechat.TransfersResponse, error) {
|
|
|
|
nonceStr := gopay.GetRandomString(32)
|
|
partnerTradeNo := gopay.GetRandomString(32)
|
|
// 初始化参数结构体
|
|
body := make(gopay.BodyMap)
|
|
body.Set("nonce_str", nonceStr)
|
|
body.Set("partner_trade_no", partnerTradeNo)
|
|
body.Set("openid", openId)
|
|
body.Set("check_name", "NO_CHECK") // NO_CHECK:不校验真实姓名 , FORCE_CHECK:强校验真实姓名
|
|
body.Set("amount", amount) // 企业付款金额,单位为分
|
|
body.Set("desc", desc) // 企业付款备注,必填。注意:备注中的敏感词会被转成字符*
|
|
body.Set("spbill_create_ip", ip)
|
|
body.Set("mchid", wx.Mchid)
|
|
body.Set("mch_appid", wx.Appid)
|
|
|
|
res, err := TransferExtend(body)
|
|
if err != nil {
|
|
fmt.Println("Error:", err)
|
|
return nil, err
|
|
}
|
|
fmt.Println("wxRsp:", *res)
|
|
// 保存到user_transfer
|
|
return res, nil
|
|
}
|
|
|
|
func QueryTransfer(partnerTradeNo string) {
|
|
body := make(gopay.BodyMap)
|
|
body.Set("nonce_str", gopay.GetRandomString(32))
|
|
body.Set("partner_trade_no", partnerTradeNo)
|
|
// todo: 查询, 遇到查询失败,需要原订单号重新请求
|
|
}
|
|
|
|
// 发送红包
|
|
func SendRedPack(sendName, openId, wishing, ip, actName, remark string, totalAmount, totalNum, scene int) (*wx.RedPackResult, error) {
|
|
mchBillNo := gopay.GetRandomString(28)
|
|
|
|
body := make(gopay.BodyMap)
|
|
body.Set("nonce_str", gopay.GetRandomString(32))
|
|
body.Set("mch_billno", mchBillNo)
|
|
body.Set("send_name", sendName)
|
|
body.Set("re_openid", openId)
|
|
body.Set("total_amount", totalAmount)
|
|
body.Set("total_num", totalNum)
|
|
body.Set("wishing", wishing)
|
|
body.Set("client_ip", ip)
|
|
body.Set("act_name", actName)
|
|
body.Set("remark", remark)
|
|
body.Set("scene_id", fmt.Sprintf("PRODUCT_%d", scene))
|
|
body.Set("wxappid", wx.Appid)
|
|
body.Set("mch_id", wx.Mchid)
|
|
|
|
bs, err := ClientExtend(body, wx.SendRedPackURL)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
res := new(wx.RedPackResult)
|
|
if err = xml.Unmarshal(bs, res); err != nil {
|
|
logger.Sugar.Errorf("xml.Unmarshal(%s): %s", string(bs), err)
|
|
return nil, fmt.Errorf("xml.Unmarshal(%s):%s", string(bs), err)
|
|
}
|
|
|
|
if res.ReturnCode != wx.CODE_SUCCESS {
|
|
err = fmt.Errorf("network error, retrun_code: %v and return_msg: %v", res.ReturnCode, res.ReturnMsg)
|
|
logger.Sugar.Error(err)
|
|
return nil, err
|
|
}
|
|
|
|
userRedPack := new(models.UserRedPack)
|
|
userRedPack.ErrCode = res.ErrCode
|
|
userRedPack.ErrCodeDes = res.ErrCodeDes
|
|
userRedPack.MchBillno = mchBillNo
|
|
userRedPack.ReOpenid = openId
|
|
userRedPack.SceneId = scene
|
|
userRedPack.SendListid = res.SendListid
|
|
userRedPack.TotalAmount = totalAmount
|
|
userRedPack.TotalNum = totalNum
|
|
userRedPack.ResultCode = res.ResultCode
|
|
userRedPack.IsDelete = false
|
|
userRedPack.UpdatedAt = time.Now()
|
|
userRedPack.CreatedAt = time.Now()
|
|
if _, err := core.GetXormAuto().InsertOne(userRedPack); err != nil {
|
|
logger.Sugar.Errorf("insert into user red pack error: %s", err)
|
|
return nil, err
|
|
}
|
|
return res, nil
|
|
|
|
}
|
|
|
|
// todo: 小心谨慎查询
|
|
func QueryRedPack(mchBillno string) (*wx.QueryRedPackResult, error) {
|
|
body := make(gopay.BodyMap)
|
|
body.Set("nonce_str", gopay.GetRandomString(32))
|
|
body.Set("mch_billno", mchBillno)
|
|
body.Set("bill_type", "MCHT")
|
|
body.Set("appid", wx.Appid)
|
|
body.Set("mch_id", wx.Mchid)
|
|
bs, err := ClientExtend(body, wx.QueryRedPackURL)
|
|
if err != nil {
|
|
logger.Sugar.Errorf("client extend request wx error: %s", err)
|
|
return nil, err
|
|
}
|
|
res := new(wx.QueryRedPackResult)
|
|
if err = xml.Unmarshal(bs, res); err != nil {
|
|
logger.Sugar.Errorf("xml.Unmarshal(%s):%s", string(bs), err)
|
|
return nil, fmt.Errorf("xml.Unmarshal(%s):%s", string(bs), err)
|
|
}
|
|
if res.ReturnCode != wx.CODE_SUCCESS {
|
|
err = fmt.Errorf("network error, retrun_code: %v and return_msg: %v", res.ReturnCode, res.ReturnMsg)
|
|
logger.Sugar.Error(err)
|
|
return nil, err
|
|
}
|
|
|
|
return res, nil
|
|
}
|