|
|
@@ -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()
|