小Z最近在做微信支付和支付宝的退款整合,其中公司申请的微信支付中移动支付和Web支付又用到了两个AppId,所以目前小Z只是简单的引用了代码,后期还需要对于代码进行重构,以使得代码结构更加合理,可读性更强。
两种支付的退款流程有所区别,在自身系统的业务已经处理完用户退款申请和审核之后,进行退款操作,调用小Z支付中心的WebAPI接口,其中微信会通过Http请求直接向微信支付端发起退款操作,而支付宝需要构造出请求页面,调用出即时到账有密退款,填写支付密码后,完成退款申请,其后支付宝会进行服务台的支付回调。
以下是WebAPI的代码:
<span style="white-space:pre"> </span>/// <summary>
/// 账单退款
/// </summary>
/// <param name="billId"></param>
/// <param name="refundRecordId"></param>
/// <returns></returns>
[HttpGet]
[Route("Bills/BillRefund")]
public IHttpActionResult RefundBill(Guid billId, Guid refundRecordId)
{
var bill = _billServices.GetByKey(billId);
switch (bill.PayType)
{
case "WeChatPay":
var result_WeChatPay_WEB_refund = PayCenter.Api.WeChatPay_WEB.Refund.Run(bill.TransactionId, bill.BillCode, ((int)(bill.Amount * 100)).ToString(), ((int)(bill.Amount * 100)).ToString(), refundRecordId.ToString());
if (result_WeChatPay_WEB_refund.GetValue("result_code").ToString() == "SUCCESS" && result_WeChatPay_WEB_refund.GetValue("return_msg").ToString() == "OK")
{
var refund_id = result_WeChatPay_WEB_refund.GetValue("refund_id").ToString();
var refund_fee = Convert.ToDecimal(result_WeChatPay_WEB_refund.GetValue("refund_fee").ToString()) / 100;
var out_refund_no = result_WeChatPay_WEB_refund.GetValue("out_refund_no").ToString();
_billServices.RefundBill(billId, out_refund_no, refund_id, refund_fee);
return Ok(ApiResponse.Ok("退款成功"));
}
else
{
return Ok(ApiResponse.InValidRequest("退款失败"));
}
case "WeChatPayMobile":
var result = PayCenter.Api.WeChatPay.Refund.Run(bill.TransactionId, bill.BillCode, ((int)(bill.Amount * 100)).ToString(), ((int)(bill.Amount * 100)).ToString(), refundRecordId.ToString());
if (result.GetValue("result_code").ToString() == "SUCCESS" && result.GetValue("return_msg").ToString() == "OK")
{
var refund_id = result.GetValue("refund_id").ToString();
var refund_fee = Convert.ToDecimal(result.GetValue("refund_fee").ToString()) / 100;
var out_refund_no = result.GetValue("out_refund_no").ToString();
_billServices.RefundBill(billId, out_refund_no, refund_id, refund_fee);
return Ok(ApiResponse.Ok("退款成功"));
}
else
{
return Ok(ApiResponse.InValidRequest("退款失败"));
}
case "AliPay":
return Redirect(Com.Alipay.Config.RefundFastPayByPlatformPwdUrl + "?billId=" + billId);
default:
break;
}
return Ok(ApiResponse.InValidRequest("退款失败"));
}