您的位置:首页 > 移动开发 > 微信开发

【微信开发】-- 公众号支付

2017-01-20 08:33 197 查看
公众号支付就是在微信里面的H5页面唤起微信支付,不用扫码即可付款的功能。做这个功能首先要明确的就是,只有和商户号mch_id匹配的appid才能成功支付。商户号在注册成功的时候就会将相关信息发送到邮箱里面。而唤起支付的一个关键是靠openid拿到统一下单。而openid是和appid一一对应的。也就是说如果你登录使用的appid不是公众号的appid,得到的openid就无法唤起公众号内的支付(会出现appid和商户号不匹配的错误)。曾经就在这个地方绕了个弯,因为微信的开放平台可以创建网站应用,也有一个appid和appsecreat,也可以在微信里面一键登录

业务流程

下面是微信的官方流程,看似有点复杂,重点就是要拿到统一下单接口返回的json串,其他按照官方demo基本就能正确,下面说一下几个细节。

function jsApiCall(json, success, fail) {
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
json,//josn串
function (res)
{
WeixinJSBridge.log(res.err_msg);
//alert(res.err_code + res.err_desc + res.err_msg);
if (res.err_msg == "get_brand_wcpay_request:ok") {
//充值进去 要区分是出题充值 还是购买悬赏 前者冲到他的钱包
//后者直接冲到系统账户
if (success) success();
}
if (res.err_msg == 'get_brand_wcpay_request:cancel') {
// alert('取消支付');
if (fail)fail();
}
}
);
}

function callpay(json,success,fail)
{
if (typeof WeixinJSBridge == "undefined")
{
alert("请在微信中打开!");
if (document.addEventListener)
{
document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
}
else if (document.attachEvent)
{
document.attachEvent('WeixinJSBridgeReady', jsApiCall);
document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
}
}
else
{
jsApiCall(json, success, fail);
}
}


View Code

[LoginValid]
public ActionResult H5PayJson(string orederId)
{
var user = _workContext.CurrentUser;
var order = _paymentService.GetOrderByOrderNumber(orederId);
//判断订单是否存在
//订单是否已经支付了
var openid = user.OpenId;
var jsApipay = new JsApiPayMvc(ControllerContext.HttpContext)
{
openid = openid,
total_fee = (int) order.Amount*100
};
try
{
jsApipay.GetUnifiedOrderResult();
return Json(jsApipay.GetJsApiParameters());//实际还是字符串
}
catch (Exception e)
{
//统一下单失败
return Json(new PortalResult(false, e.Message));
}
}


调用的时候这样直接唤起支付了。 但如果传入的json不是json对象,微信加载动画会一直卡在哪儿。

$.post("/Checkout/H5PayJson", { orederId: orderId }, function (jsondata) {
var jdata = JSON.parse(jsondata);
if (jdata.appId) {
callpay(jdata, function () {
$.post("/payment/WeiXinPaySuccess", { ordernumber: orderId }, function (paymentdata) {
if (paymentdata.IsSuccess === true) {
submitQuestion();
} else {
$.alert(paymentdata.Message);
}
});
}, function () {
$.alert("你已取消支付!");
});
} else {
alert("统一下单失败!");
}
});


官方文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_3

微信登录:http://www.cnblogs.com/stoneniqiu/p/5380606.html

微信扫码支付及MVC demo:http://www.cnblogs.com/stoneniqiu/p/5525548.html

官方demo:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: