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.

140 lines
3.6 KiB

4 years ago
package alipay
import (
"errors"
"fmt"
alipay2 "git.oa00.com/go/alipay"
"github.com/smartwalle/alipay/v3"
4 years ago
"io/ioutil"
"log"
"net/http"
"net/url"
"recook/internal/v2/logic/pay"
"recook/internal/v2/model/recook/after"
"strings"
"time"
4 years ago
"github.com/jinzhu/gorm"
"github.com/shopspring/decimal"
4 years ago
)
const (
4 years ago
AppID = "2021003107650938"
4 years ago
RefundURL = "https://openapi.alipay.com/gateway.do" // 退款
)
type RefundPublicParam struct {
AppID string `json:"app_id"` // 支付宝分配给开发者的应用ID
Method string `json:"method"` // 接口名称
Charset string `json:"charset"` // 请求使用的编码格式如utf-8
SignType string `json:"sign_type"` // 商户生成签名字符串所使用的签名算法类型目前支持RSA2和RSA推荐使用RSA2
Sign string `json:"sign"` // 商户请求参数的签名串
Timestamp string `json:"timestamp"` // 发送请求的时间,格式"yyyy-MM-dd HH:mm:ss"
Version string `json:"version"` // 调用的接口版本固定为1.0
BizContent string `json:"biz_content"`
}
func newPublicParam(d *RefundDetailParam) RefundPublicParam {
ts := time.Now().Format("2006-01-02 15:04:05")
biz, _ := json.Marshal(d)
return RefundPublicParam{
AppID: AppID,
Method: "alipay.trade.refund",
Charset: "utf-8",
SignType: "RSA2",
Version: "1.0",
Timestamp: ts,
BizContent: string(biz),
}
}
func (r *RefundPublicParam) generateRequestParam() string {
r.Sign = generateSign(r)
m := struct2MapWhenAlipay(r)
p := url.Values{}
for k, v := range m {
if len(v) > 0 {
p.Add(k, v)
}
}
return p.Encode()
}
type RefundDetailParam struct {
OutTradeNo string `json:"out_trade_no"`
RefundAmount string `json:"refund_amount"`
OutRequestNo string `json:"out_request_no"`
}
type RefundResult struct {
Response struct {
Code string `json:"code"`
} `json:"alipay_trade_refund_response"`
Sign string `json:"sign"`
}
func Refund(tx *gorm.DB, asGoods *after.RecookAfterSalesGoodsModel) error {
//这边判断是否有金额
4 years ago
fmt.Println("退款金额:", asGoods.RefundAmount.Truncate(2).String(), "========")
4 years ago
if asGoods.RefundAmount.GreaterThan(decimal.NewFromFloat(0.0)) {
param := alipay.TradeRefund{
4 years ago
OutTradeNo: asGoods.TradeNo,
RefundAmount: asGoods.RefundAmount.Truncate(2).String(),
OutRequestNo: asGoods.RefundNo,
}
refund, _ := alipay2.Alipay.TradeRefund(param)
if !refund.Content.Code.IsSuccess() {
return errors.New("支付宝退款结果不对")
4 years ago
}
//detailParam := RefundDetailParam{
// OutTradeNo: asGoods.TradeNo,
// RefundAmount: asGoods.RefundAmount.Truncate(2).String(),
// OutRequestNo: asGoods.RefundNo,
//}
//
//pub := newPublicParam(&detailParam)
//if err := RequestOrderRefund(&pub); err != nil {
// return err
//}
4 years ago
}
return pay.SyncRefundSuccessCallback(tx, asGoods)
}
func RequestOrderRefund(param *RefundPublicParam) error {
client := &http.Client{}
request, err := http.NewRequest("POST", RefundURL, strings.NewReader(param.generateRequestParam()))
if err != nil {
return err
}
request.Header.Set("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
response, err := client.Do(request)
if err != nil {
return err
}
defer func() { _ = response.Body.Close() }()
result, err := ioutil.ReadAll(response.Body)
if err != nil {
return err
}
fmt.Println("===============================")
fmt.Println(string(result))
var r RefundResult
err = json.Unmarshal(result, &r)
if err != nil {
return err
}
if r.Response.Code != "10000" {
log.Println(r)
return errors.New("支付宝退款请求结果不对")
}
return nil
}