Procházet zdrojové kódy

Support allinpay refund in legacy mall api

Your Name před 2 týdny
rodič
revize
8fb86e61ad

+ 64 - 1
go/gopath/src/fohow.com/apps/helpers/benefit_helper.go

@@ -1,20 +1,32 @@
 package helpers
 
 import (
+	"bytes"
+	"encoding/json"
 	"errors"
 	"fmt"
 	"fohow.com/apps/models/balance_model"
 	"fohow.com/apps/models/order_model"
+	"fohow.com/apps/models/pay_model"
 	"fohow.com/apps/models/sys_config"
 	"fohow.com/apps/models/user_model"
 	"fohow.com/libs/wx_mp"
 	"github.com/astaxie/beego"
+	"io/ioutil"
 	"math"
 	"math/rand"
+	"net/http"
 	"strings"
 	"time"
 )
 
+const allinpayRefundURL = "https://www.fohow.hk/pay-agent/refund"
+
+type allinpayRefundResp struct {
+	Code int    `json:"code"`
+	Msg  string `json:"msg"`
+}
+
 func NewSendInviterBenefit(wxUser *user_model.WxUser, orderId, source string) {
 
 	var benefitWxUser *user_model.WxUser
@@ -129,6 +141,13 @@ func ShopSendInviterBenefit(wxUser *user_model.WxUser, orderId, source string) {
 }
 
 func Refund(o *order_model.Order, refund *order_model.OrderRefund) error {
+	if o.PayWay == pay_model.PAYWAY_ALLINPAY && o.PaiedPrice > int64(0) {
+		if err := refundAllinpayOrder(o, refund); err != nil {
+			beego.BeeLogger.Error("allinpay refund fail, order_id=%s refund_id=%d err=%s", o.OrderId, refund.Id, err)
+			return err
+		}
+	}
+
 	o.Status = order_model.STATUS_REFUNDED
 	if !o.Save() {
 		beego.BeeLogger.Error("OrderRefund[%d] fail", refund.Id)
@@ -188,7 +207,7 @@ func Refund(o *order_model.Order, refund *order_model.OrderRefund) error {
 		}
 
 		//微信支付金额原路退款
-		if o.PaiedPrice > int64(0) {
+		if o.PaiedPrice > int64(0) && o.PayWay == pay_model.PAYWAY_WEIXINPAY {
 			outTradeNo := fmt.Sprintf("%s-%d", refund.OrderId, refund.Id)
 			outRefundNo := createOrderId("refund")
 			remark := fmt.Sprintf("%s%s", refund.OrderId, "退款")
@@ -204,6 +223,50 @@ func Refund(o *order_model.Order, refund *order_model.OrderRefund) error {
 	return nil
 }
 
+func refundAllinpayOrder(o *order_model.Order, refund *order_model.OrderRefund) error {
+	payload := map[string]string{
+		"oriAccessOrderId": o.OrderId,
+		"accessOrderId":    fmt.Sprintf("%s-R-%d", refund.OrderId, refund.Id),
+		"refundAmount":     fmt.Sprintf("%d", refund.RefundFee),
+	}
+
+	body, err := json.Marshal(payload)
+	if err != nil {
+		return err
+	}
+
+	req, err := http.NewRequest(http.MethodPost, allinpayRefundURL, bytes.NewReader(body))
+	if err != nil {
+		return err
+	}
+	req.Header.Set("Content-Type", "application/json")
+
+	client := &http.Client{Timeout: 15 * time.Second}
+	resp, err := client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer resp.Body.Close()
+
+	respBody, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return err
+	}
+
+	if resp.StatusCode != http.StatusOK {
+		return fmt.Errorf("allinpay refund http_status=%d body=%s", resp.StatusCode, string(respBody))
+	}
+
+	var result allinpayRefundResp
+	if err := json.Unmarshal(respBody, &result); err != nil {
+		return err
+	}
+	if result.Code != 0 {
+		return fmt.Errorf("allinpay refund failed: %s", result.Msg)
+	}
+	return nil
+}
+
 // 生成订单ID
 func createOrderId(prefix string) string {
 	n1 := time.Now().UnixNano()

+ 1 - 0
go/gopath/src/fohow.com/apps/models/order_model/order.go

@@ -35,6 +35,7 @@ const (
 	ORDER_ID_PREFIX_EX = "EX" //兑换订单
 
 	PAY_WAY_WEIXIN   = "weixinpay" //微信支付
+	PAY_WAY_ALLINPAY = "allinpay"  //通联支付
 	PAY_WAY_BALANCE  = "balance"   //提货券余额支付
 	PAY_WAY_INTEGRAl = "integral"  //提货券支付
 	PAY_WAY_CENT     = "cent"      //积分支付

+ 1 - 0
go/gopath/src/fohow.com/apps/models/pay_model/init.go

@@ -6,6 +6,7 @@ func init() {
 
 const (
 	PAYWAY_WEIXINPAY = "weixinpay" //微信支付
+	PAYWAY_ALLINPAY  = "allinpay"  //通联支付
 	PAYWAY_BALANCE   = "balance"   //我的提货券
 	PAYWAY_CASH      = "cash"      //佣金支付
 	PAY_WAY_INTEGRAL = "integral"  //提货券