notice.go 10.9 KB
Newer Older
1 2 3
package pay

import (
wangp's avatar
wangp committed
4
	"database/sql"
5 6 7 8 9 10 11
	"encoding/json"
	"fmt"
	"system_pay/controller/base"
	"system_pay/models"
	"system_pay/mysql"
)

wangp's avatar
wangp committed
12 13
// 拉卡拉支付回调(收银台)
func CashierNotice(input *models.CashierNoticeInput) (*base.ResponseDataWxNotice, error) {
14

wangp's avatar
wangp committed
15
	fmt.Println("拉卡拉回调(收银台)输入参数")
16 17 18 19
	fmt.Println(input)

	response := new(base.ResponseDataWxNotice)

wangp's avatar
wangp committed
20 21 22 23 24 25 26 27
	//db, err := mysql.NewShopConn()
	//if err != nil {
	//	response.Code = "FAIL"
	//	response.Message = "参数格式校验错误"
	//	return response, err
	//}

	// 插入数据库
wangp's avatar
wangp committed
28
	db, err := mysql.NewPayConn()
wangp's avatar
wangp committed
29 30 31 32 33
	if err != nil {
		return response, err
	}

	tx, err := db.Begin()
34 35 36 37
	if err != nil {
		return response, err
	}

wangp's avatar
wangp committed
38
	defer mysql.CloseTx(tx, err)
wangp's avatar
wangp committed
39

40 41
	fmt.Println("111")

wangp's avatar
wangp committed
42
	//1.订单存在check
43 44
	var billID int64
	var attach, url string
wangp's avatar
wangp committed
45
	err = db.QueryRow("select ifnull(id, 0), attach, notify_pay_url from system_pay_bill where payment_order_code = ?",
46 47 48
		input.OutOrderNo).Scan(&billID, &attach, &url)
	if err != nil || billID == 0 || billID == 2 {
		response.Code = "FAIL"
wangp's avatar
wangp committed
49
		response.Message = "db operation fail1"
50 51 52 53 54
		return response, err
	}

	fmt.Println("222")

wangp's avatar
wangp committed
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
	//if noticeRequest.ReturnCode == "SUCCESS" {
		// 把订单状态置为 结算成功
		err = BillPayStateSuccess(tx, billID)
		if err != nil {
			//beego.Error("微信回调, 根据订单id 把订单置为结算成功 失败: ", err)
			//response.ReturnCode = "FAIL"
			//response.ReturnMsg = "db operation fail"
			//return response, nil
			response.Code = "FAIL"
			response.Message = "db operation fail2"
			InsertPayBillDetailNoticeResponseBody(tx, billID, response)
			return response, err
		}
	//} else {
	//
	//	// 把订单状态置为 结算失败
	//	err = repository.BillPayStateFail(tx, billID)
	//	if err != nil {
	//		beego.Error("微信回调, 根据订单id 把订单置为结算成功 失败: ", err)
	//		response.ReturnCode = "FAIL"
	//		response.ReturnMsg = "db operation fail"
	//		return response, nil
	//	}
	//}

wangp's avatar
wangp committed
80
	//2.「拉卡拉返回数据」存入 notice_request_body
wangp's avatar
wangp committed
81
	err = InsertPayBillDetailNoticeRequestBody(tx, billID, input)
82 83 84
	if err != nil {
		//beego.Error("微信回调, 根据订单id 插入回调Request参数 失败: ", err)
		response.Code = "FAIL"
wangp's avatar
wangp committed
85
		response.Message = "db operation fail3"
wangp's avatar
wangp committed
86
		InsertPayBillDetailNoticeResponseBody(tx, billID, response)
87 88 89 90 91
		return response, err
	}

	fmt.Println("333")

wangp's avatar
wangp committed
92 93
	//3.拉卡拉订收银台订单查询 - check todo

94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
	//3.存入 notice_response_body
	//err = InsertPayBillDetailNoticeResponseBody(billID, response)
	//if err != nil {
	//	beego.Error("微信回调, 根据订单id 插入回调Response参数 失败: ", err)
	//	response.ReturnCode = "FAIL"
	//	response.ReturnMsg = "db operation fail"
	//	return err
	//}

	//beego.Info("回调成功 订单成功")

	//type CallbackResponse struct {
	//	OutTradeNo    string `json:"out_trade_no"`   // 订单号
	//	ReturnMsg     string `json:"return_msg"`     // 是否成功
	//	AttachInfo    string `json:"attach_info"`    // 附加信息
	//	TransactionID string `json:"transaction_id"` // 微信支付订单号
	//	TradeNo       string `json:"trade_no"`       // 支付宝交易流水号
	//}

	if url != "" {
		//4.回调业务方「回调函数」
		callbackResponse := new(models.CallbackResponse)
		callbackResponse.ReturnMsg = "SUCCESS"
		//callbackResponse.OutTradeNo = input.OutTradeNo
		//callbackResponse.TransactionID = input.TransactionId
wangp's avatar
wangp committed
119
		callbackResponse.OutTradeNo = input.OutOrderNo //交易凭据单号 todo ?
wangp's avatar
wangp committed
120
		//callbackResponse.TransactionID = input.OutOrderNo //交易凭据单号 todo ? strconv.Itoa(
121

wangp's avatar
wangp committed
122
		OrderTradeInfo, _ := input.OrderTradeInfo.(map[string]interface{})
wangp's avatar
wangp committed
123
		if OrderTradeInfo["auth_code"] != nil {
wangp's avatar
wangp committed
124 125 126 127
			//LAKALA签约协议号列表
			callbackResponse.AuthCode = OrderTradeInfo["auth_code"].(string)
		}

wangp's avatar
wangp committed
128 129 130 131 132 133 134 135 136 137
		if OrderTradeInfo["acc_trade_no"] != nil {
			//账户端交易订单号
			callbackResponse.TransactionID = OrderTradeInfo["acc_trade_no"].(string)
		}

		if OrderTradeInfo["trade_no"] != nil {
			//交易流水号
			callbackResponse.TradeNo = OrderTradeInfo["trade_no"].(string)
		}

138 139 140 141 142 143 144
		attachMap := make(map[string]interface{}, 0)
		_ = json.Unmarshal([]byte(attach), &attachMap)
		if attachMap["store_sn"].(string) == "" {
			callbackResponse.AttachInfo = attachMap["old_attach"].(string)
		} else {
			callbackResponse.AttachInfo = attach  //商户订单号(谛宝多多)
		}
wangp's avatar
wangp committed
145 146
		//fmt.Println("444444444444444444444444444")
		//fmt.Println(callbackResponse)
147
		go callBackBusinessService(input.OutOrderNo, url, callbackResponse)
wangp's avatar
wangp committed
148

149 150 151 152
	}

	response.Code = "SUCCESS"
	response.Message = "执行成功"
wangp's avatar
wangp committed
153
	InsertPayBillDetailNoticeResponseBody(tx, billID, response)
wangp's avatar
wangp committed
154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264
	return response, nil
}

// 拉卡拉支付回调(扫码)
func ScanNotice(input *models.ScanNoticeInput) (*base.ResponseDataWxNotice, error) {

	fmt.Println("拉卡拉回调(扫码)输入参数")
	fmt.Println(input)

	response := new(base.ResponseDataWxNotice)

	//db, err := mysql.NewShopConn()
	//if err != nil {
	//	response.Code = "FAIL"
	//	response.Message = "参数格式校验错误"
	//	return response, err
	//}

	// 插入数据库
	db, err := mysql.NewPayConn()
	if err != nil {
		return response, err
	}

	tx, err := db.Begin()
	if err != nil {
		return response, err
	}

	defer mysql.CloseTx(tx, err)

	fmt.Println("111")

	//1.订单存在check
	var billID int64
	var attach, url string
	err = db.QueryRow("select ifnull(id, 0), attach, notify_pay_url from system_pay_bill where payment_order_code = ?",
		input.OutTradeNo).Scan(&billID, &attach, &url)
	if err != nil || billID == 0 || billID == 2 {
		response.Code = "FAIL"
		response.Message = "db operation fail1"
		return response, err
	}

	fmt.Println("222")

	//if noticeRequest.ReturnCode == "SUCCESS" {
	// 把订单状态置为 结算成功
	err = BillPayStateSuccess(tx, billID)
	if err != nil {
		//beego.Error("微信回调, 根据订单id 把订单置为结算成功 失败: ", err)
		//response.ReturnCode = "FAIL"
		//response.ReturnMsg = "db operation fail"
		//return response, nil
		response.Code = "FAIL"
		response.Message = "db operation fail2"
		InsertPayBillDetailNoticeResponseBody(tx, billID, response)
		return response, err
	}
	//} else {
	//
	//	// 把订单状态置为 结算失败
	//	err = repository.BillPayStateFail(tx, billID)
	//	if err != nil {
	//		beego.Error("微信回调, 根据订单id 把订单置为结算成功 失败: ", err)
	//		response.ReturnCode = "FAIL"
	//		response.ReturnMsg = "db operation fail"
	//		return response, nil
	//	}
	//}

	//2.「拉卡拉返回数据」存入 notice_request_body
	err = InsertPayBillDetailNoticeRequestBody(tx, billID, input)
	if err != nil {
		//beego.Error("微信回调, 根据订单id 插入回调Request参数 失败: ", err)
		response.Code = "FAIL"
		response.Message = "db operation fail3"
		InsertPayBillDetailNoticeResponseBody(tx, billID, response)
		return response, err
	}

	fmt.Println("333")

	//3.拉卡拉订收银台订单查询 - check todo

	//3.存入 notice_response_body
	//err = InsertPayBillDetailNoticeResponseBody(billID, response)
	//if err != nil {
	//	beego.Error("微信回调, 根据订单id 插入回调Response参数 失败: ", err)
	//	response.ReturnCode = "FAIL"
	//	response.ReturnMsg = "db operation fail"
	//	return err
	//}

	//beego.Info("回调成功 订单成功")

	//type CallbackResponse struct {
	//	OutTradeNo    string `json:"out_trade_no"`   // 订单号
	//	ReturnMsg     string `json:"return_msg"`     // 是否成功
	//	AttachInfo    string `json:"attach_info"`    // 附加信息
	//	TransactionID string `json:"transaction_id"` // 微信支付订单号
	//	TradeNo       string `json:"trade_no"`       // 支付宝交易流水号
	//}

	if url != "" {
		//4.回调业务方「回调函数」
		callbackResponse := new(models.CallbackResponse)
		callbackResponse.ReturnMsg = "SUCCESS"
		//callbackResponse.OutTradeNo = input.OutTradeNo
		//callbackResponse.TransactionID = input.TransactionId
		callbackResponse.OutTradeNo = input.OutTradeNo //交易凭据单号 todo ?
wangp's avatar
wangp committed
265
		//callbackResponse.TransactionID = input.OutTradeNo //交易凭据单号 todo ? strconv.Itoa(
wangp's avatar
wangp committed
266 267 268 269 270 271 272

		//OrderTradeInfo, _ := input.OrderTradeInfo.(map[string]interface{})
		//if OrderTradeInfo["auth_code"] != nil {
		//	//LAKALA签约协议号列表
		//	callbackResponse.AuthCode = OrderTradeInfo["auth_code"].(string)
		//}

wangp's avatar
wangp committed
273 274 275 276 277 278
		//账户端交易订单号
		callbackResponse.TransactionID = input.AccTradeNo

		//交易流水号
		callbackResponse.TradeNo = input.TradeNo

wangp's avatar
wangp committed
279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294
		attachMap := make(map[string]interface{}, 0)
		_ = json.Unmarshal([]byte(attach), &attachMap)
		if attachMap["store_sn"].(string) == "" {
			callbackResponse.AttachInfo = attachMap["old_attach"].(string)
		} else {
			callbackResponse.AttachInfo = attach  //商户订单号(谛宝多多)
		}
		//fmt.Println("444444444444444444444444444")
		//fmt.Println(callbackResponse)
		go callBackBusinessService(input.OutTradeNo, url, callbackResponse)

	}

	response.Code = "SUCCESS"
	response.Message = "执行成功"
	InsertPayBillDetailNoticeResponseBody(tx, billID, response)
295 296 297 298
	return response, nil
}

// InsertPayBillDetailNoticeRequestBody is 插入支付订单详情表中的 下单参数字段 notice_request_body
wangp's avatar
wangp committed
299
func InsertPayBillDetailNoticeRequestBody(tx *sql.Tx, billID int64, noticeRequestBody interface{}) error {
300 301 302 303 304

	body, err := json.Marshal(noticeRequestBody)
	if err != nil {
		return err
	}
wangp's avatar
wangp committed
305 306
	insertPayBillDetailSQL := `update system_pay_bill_detail set notice_request_body = ? where pay_bill_id = ?`
	result, err := tx.Exec(insertPayBillDetailSQL, string(body), billID)
307 308 309 310 311 312 313 314 315 316 317 318
	if err != nil {
		return err
	}

	_, err = result.RowsAffected()
	if err != nil {
		return err
	}
	return nil
}

// InsertPayBillDetailNoticeResponseBody is 插入支付订单详情表中的 下单参数字段 notice_response_body
wangp's avatar
wangp committed
319
func InsertPayBillDetailNoticeResponseBody(tx *sql.Tx, billID int64, noticeResponseBody interface{}) error {
320 321 322 323 324

	body, err := json.Marshal(noticeResponseBody)
	if err != nil {
		return err
	}
wangp's avatar
wangp committed
325 326
	insertPayBillDetailSQL := `update system_pay_bill_detail set notice_response_body = ? where pay_bill_id = ?`
	result, err := tx.Exec(insertPayBillDetailSQL, string(body), billID)
327 328 329 330 331 332 333 334 335 336 337
	if err != nil {
		return err
	}

	_, err = result.RowsAffected()
	if err != nil {
		return err
	}
	return nil
}

wangp's avatar
wangp committed
338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369
// BillPayStateSuccess is 微信回调后 把订单状态 置为结算成功
func BillPayStateSuccess(tx *sql.Tx, billID int64) error {

	insertPayBillDetailSQL := `update system_pay_bill set result_code = 1 where id = ?`
	result, err := tx.Exec(insertPayBillDetailSQL, billID)
	if err != nil {
		return err
	}

	_, err = result.RowsAffected()
	if err != nil {
		return err
	}
	return nil
}

// BillPayStateFail is 微信回调后 把订单状态 置为结算失败
//func BillPayStateFail(tx *sql.Tx, billID int64) error {
//
//	insertPayBillDetailSQL := `update system_pay_bill set result_code = 2 where id = ?`
//	result, err := tx.Exec(insertPayBillDetailSQL, billID)
//	if err != nil {
//		return err
//	}
//
//	_, err = result.RowsAffected()
//	if err != nil {
//		return err
//	}
//	return nil
//}