稍微需要注意下的地方就是几个默认参数的名字和别的方法不一样,比如appid和mch_id。转账中是mch_appid和mchid,红包中又叫wxappid和mch_id。然后注意到httpService.post方法第三个参数是带true的。也就是会使用到证书。进入post方法中我们可以看到:
//是否使用证书
if (isUseCert)
{
string path = HttpContext.Current.Request.PhysicalApplicationPath;
X509Certificate2 cert = new X509Certificate2(path + WxPayConfig.SSLCERT_PATH, WxPayConfig.SSLCERT_PASSWORD);
request.ClientCertificates.Add(cert);
Log.Debug("WxPayApi", "PostXml used cert");
}
这里使用到了证书的路径和密码,密码即商户号。这一切准备好之后就可以controller中进行转账了:
[LoginValid]
public ActionResult CashTransfers(string orderNumber)
{
//var order = new Order(){Amount = 1};
// var openid = "oBSBmwQjqwjfzQlKsFNjxFLSixxx";
var user = _workContext.CurrentUser;
var order = _paymentService.GetOrderByOrderNumber(orderNumber);
var transfer = new TransfersPay
{
openid = user.OpenId,
amount = (int) order.Amount*100,
partner_trade_no = order.OrderNumber,
re_user_name = "stoneniqiu",
spbill_create_ip = _webHelper.GetCurrentIpAddress()
};
var data = transfer.GetTransfersApiParameters();
var result = WxPayApi.Transfers(data);
return Content(result.ToPrintStr());
}
得到结果

这样就实现了转账/提现的功能。
发布
在正式的环境中,我们需要先创建自己的订单,然后向微信请求转账,成功之后对自己的订单进行处理。CashTransfers方法稍作调整。
[LoginValid]
public ActionResult CashTransfers(string orderNumber)
{
var user = _workContext.CurrentUser;
var order = _paymentService.GetOrderByOrderNumber(orderNumber);
if (string.IsNullOrEmpty(user.OpenId))
{
return Json(new PortalResult("请用微信登录!"));
}
if (order == null || order.OrderState != OrderState.Padding)
{
return Json(new PortalResult("订单有误!"));
}
var transfer = new TransfersPay
{
openid = user.OpenId,
amount = (int) order.Amount*100,
partner_trade_no = order.OrderNumber,
re_user_name = "stoneniqiu",
spbill_create_ip = _webHelper.GetCurrentIpAddress()
};
var data = transfer.GetTransfersApiParameters();
var result = WxPayApi.Transfers(data);
if (result.GetValue("result_code").ToString() == "SUCCESS")
{
return Json(new PortalResult(true, "提现成功"));
}
return Json(new PortalResult(false, result.GetValue("return_msg").ToString()));
}










