用c#开发微信 (22) 微信商城 - 微信支付 (c#源码)
2015-07-30 08:11
567 查看
微信支付有几种支付模式:刷卡支付,扫码支付,公众号支付,APP支付。本文介绍用于在微信商城里的公众号支付。
点击上面的确认支付,转到下面微信支付页面:
可关注微信号webuscn或扫描下面二维码,进入微商城体验:
作者:疯吻IT出处:http://fengwenit.cnblogs.com
1、拥有公众帐号,且为服务号、企业号;
2、公众帐号须通过微信认证;(未认证用户,可先申请微信认证)
3、政府、媒体两大类型的订阅号支持申请微信支付(点此了解更多)。
4、企业号也支持申请微信支付,请在企业号管理平台发起申请。
温馨提示:
1、微信支付商户申请无开通费用及保证金;
2、微信认证资质审核通过后,即可申请微信支付功能;
3、订阅号可先升级为服务号,升级方法点击这里了解。
1.效果图
在商城里购买商品后,到支付页面:点击上面的确认支付,转到下面微信支付页面:
可关注微信号webuscn或扫描下面二维码,进入微商城体验:
作者:
2.申请微信支付
申请成为公众账号支付商户需要满足以下条件:1、拥有公众帐号,且为服务号、企业号;
2、公众帐号须通过微信认证;(未认证用户,可先申请微信认证)
3、政府、媒体两大类型的订阅号支持申请微信支付
4、企业号也支持申请微信支付,请在企业号管理平台发起申请。
温馨提示:
1、微信支付商户申请无开通费用及保证金;
2、微信认证资质审核通过后,即可申请微信支付功能;
3、订阅号可先升级为服务号,升级方法
详细步骤请参考官方文档:
3.实现
3.1配置
首先要配置支付授权目录:在你的微商城系统里配置商户信息:
3.2前台代码
这个页面就是上面配置的支付授权目录下面的页面。先定义一个支付按钮:
[code]<ahref="javascript:void(0);"class="btn"id="getBrandWCPayRequest">确认支付</a>
[/code]
当微信内置浏览器完成内部初始化后会触发WeixinJSBridgeReady事件:
document.addEventListener('WeixinJSBridgeReady',functiononBridgeReady(){
//公众号支付
jQuery('a#getBrandWCPayRequest').click(function(e){
WeixinJSBridge.invoke('getBrandWCPayRequest',{
<%=packageValue%>
},function(res){
varnewurl="/api/payment/wxpay/payResult.aspx?wid="+<%=wid%>+"&otid="+'<%=otid_str%>'+"&openid="+'<%=openid%>'+"";
if(res.err_msg=="get_brand_wcpay_request:ok"){
//支付成功后清空我的订单
$.post("/shop/shopmgr.ashx?myact=clearMyOrder",{wid:'<%=wid%>',openid:'<%=openid%>'},function(data){},"json")
alert("微信支付成功,点击右上角返回!");
window.location.href=newurl;
}elseif(res.err_msg=="get_brand_wcpay_request:cancel"){
alert("您取消了支付!");
}else{
alert(res.err_msg);
alert("您支付失败了!");
}
});
});
WeixinJSBridge.log('yo~ready.');
},false);
使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
因此微信团队建议,当收到ok返回时,向商户后台询问是否收到交易成功的通知,若收到通知,前端展示交易成功的界面;若此时未收到通知,商户后台主动调用查询订单接口,查询订单的当前状态,并反馈给前端展示相应的界面。
网页端接口参数详细列表:
3.3后台代码
主要是生成前台所需要的packageValue://先设置基本信息
stringMchId=paymentInfo.partnerId;//"1218574001";//
stringpartnerKey=paymentInfo.partnerKey;//商户支付密钥Key。登录微信商户后台,进入栏目【账户设置】【密码安全】【API安全】【API密钥】
stringnotify_url="http://"+HttpContext.Current.Request.Url.Authority+"/api/payment/wxpay/notify_url.aspx";
stringtimeStamp="";
stringnonceStr="";
stringpaySign="";
stringsp_billno=out_trade_no;
//当前时间yyyyMMdd
stringdate=DateTime.Now.ToString("yyyyMMdd");
if(null==sp_billno)
{
//生成订单10位序列号,此处用时间和随机数生成,商户根据自己调整,保证唯一
sp_billno=DateTime.Now.ToString("HHmmss")+TenPayV3Util.BuildRandomStr(28);
}
//创建支付应答对象
Senparc.Weixin.MP.TenPayLibV3.RequestHandlerpackageReqHandler=newSenparc.Weixin.MP.TenPayLibV3.RequestHandler(null);
//初始化
packageReqHandler.Init();
//packageReqHandler.SetKey(""/*TenPayV3Info.Key*/);
timeStamp=TenPayV3Util.GetTimestamp();
nonceStr=TenPayV3Util.GetNoncestr();
//设置package订单参数
packageReqHandler.SetParameter("appid",uwEntity.AppId);//公众账号ID
packageReqHandler.SetParameter("mch_id",MchId);//商户号
packageReqHandler.SetParameter("nonce_str",nonceStr);//随机字符串
packageReqHandler.SetParameter("body",busiBody);//商品描述
packageReqHandler.SetParameter("attach",wid+"|"+busiBody);
packageReqHandler.SetParameter("out_trade_no",sp_billno);//商家订单号
packageReqHandler.SetParameter("total_fee",((int)(ttFee*100)).ToString());//商品金额,以分为单位(money*100).ToString()
packageReqHandler.SetParameter("spbill_create_ip",Request.UserHostAddress);//用户的公网ip,不是商户服务器IP
packageReqHandler.SetParameter("notify_url",notify_url);//接收财付通通知的URL
packageReqHandler.SetParameter("trade_type",TenPayV3Type.JSAPI.ToString());//交易类型
packageReqHandler.SetParameter("openid",openid);//用户的openId
stringsign=packageReqHandler.CreateMd5Sign("key",partnerKey);
packageReqHandler.SetParameter("sign",sign);//签名
stringdata=packageReqHandler.ParseXML();
varresult=TenPayV3.Unifiedorder(data);
varres=XDocument.Parse(result);
prepayId=res.Element("xml").Element("prepay_id").Value;
//设置支付参数
Senparc.Weixin.MP.TenPayLibV3.RequestHandlerpaySignReqHandler=newSenparc.Weixin.MP.TenPayLibV3.RequestHandler(null);
paySignReqHandler.SetParameter("appId",uwEntity.AppId);
paySignReqHandler.SetParameter("timeStamp",timeStamp);
paySignReqHandler.SetParameter("nonceStr",nonceStr);
paySignReqHandler.SetParameter("package",string.Format("prepay_id={0}",prepayId));
paySignReqHandler.SetParameter("signType","MD5");
paySign=paySignReqHandler.CreateMd5Sign("key",partnerKey);
packageValue="";
packageValue+="\"appId\":\""+uwEntity.AppId+"\",";
packageValue+="\"timeStamp\":\""+timeStamp+"\",";
packageValue+="\"nonceStr\":\""+nonceStr+"\",";
packageValue+="\"package\":\""+string.Format("prepay_id={0}",prepayId)+"\",";
packageValue+="\"signType\":\"MD5\",";
packageValue+="\"paySign\":\""+paySign+"\"";
相关文章推荐
- 微信公众平台开发
- 微信公众平台开发
- 春晚微信红包,是怎么扛住一百亿次请求的
- 微信产品经理教你做产品:一些教义少说话,需要做更多
- NET实现微信分享和获取openid
- 选择、插入排序小程序
- cordova 打包的项目里加入微信支付功能编译问题。
- 封装好的popupwiindow功能类分享到微信好友、朋友圈、qq好友、qq空间
- 冒泡排序小程序
- 微信图片选择器
- js判断是否是微信浏览器
- 下期预告:将会讲讲项目中关于微信二维码生成和传播的事儿
- 完整的微信接口类
- 微信消息回复
- Java通过JsApi方式实现微信支付
- 微信公众平台开发(80) 上传下载多媒体文件
- Android中的仿微信界面(二)
- 微信开发 消息接口
- Java实现JsApi方式的微信支付
- 微信企业号回调模式配置详细讲解