用c#开发微信 (22) 微信商城 - 微信支付 (c#源码)
微信支付有几种支付模式:刷卡支付,扫码支付,公众号支付,APP支付。本文介绍用于在微信商城里的公众号支付。
1. 效果图
在商城里购买商品后,到支付页面:

点击上面的确认支付,转到下面微信支付页面:

可关注微信号 webuscn 或扫描下面二维码,进入微商城体验:

作者:疯吻IT 出处:http://fengwenit.cnblogs.com
2. 申请微信支付
申请成为公众账号支付商户需要满足以下条件:
1、拥有公众帐号,且为服务号、企业号;
2、公众帐号须通过微信认证;(未认证用户,可先申请微信认证)
3、政府、媒体两大类型的订阅号支持申请微信支付(点此了解更多)。
4、企业号也支持申请微信支付,请在企业号管理平台发起申请。
温馨提示:
1、微信支付商户申请无开通费用及保证金;
2、微信认证资质审核通过后,即可申请微信支付功能;
3、订阅号可先升级为服务号,升级方法点击这里了解。
详细步骤请参考官方文档:
http://kf.qq.com/faq/140225MveaUz150107UVFNjy.html
3. 实现
3.1 配置
首先要配置支付授权目录:

在你的微商城系统里配置商户信息:

3.2 前台代码
这个页面就是上面配置的支付授权目录下面的页面。
先定义一个支付按钮:
<a href="javascript:void(0);" class="btn" id="getBrandWCPayRequest">确认支付</a>
当微信内置浏览器完成内部初始化后会触发WeixinJSBridgeReady事件:
document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
//公众号支付
jQuery('a#getBrandWCPayRequest').click(function (e) {
WeixinJSBridge.invoke('getBrandWCPayRequest', {
<%=packageValue%>
}, function (res) {
var newurl = "/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;
} else if (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返回时,向商户后台询问是否收到交易成功的通知,若收到通知,前端展示交易成功的界面;若此时未收到通知,商户后台主动调用查询订单接口,查询订单的当前状态,并反馈给前端展示相应的界面。
网页端接口参数详细列表:
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7
3.3 后台代码
主要是生成前台所需要的 packageValue :
//先设置基本信息
string MchId = paymentInfo.partnerId; // "1218574001";//
string partnerKey = paymentInfo.partnerKey;// 商户支付密钥Key。登录微信商户后台,进入栏目【账户设置】【密码安全】【API 安全】【API 密钥】
string notify_url = "http://" + HttpContext.Current.Request.Url.Authority + "/api/payment/wxpay/notify_url.aspx";
string timeStamp = "";
string nonceStr = "";
string paySign = "";
string sp_billno = out_trade_no;
//当前时间 yyyyMMdd
string date = DateTime.Now.ToString("yyyyMMdd");
if (null == sp_billno)
{
//生成订单10位序列号,此处用时间和随机数生成,商户根据自己调整,保证唯一
sp_billno = DateTime.Now.ToString("HHmmss") + TenPayV3Util.BuildRandomStr(28);
}
//创建支付应答对象
Senparc.Weixin.MP.TenPayLibV3.RequestHandler packageReqHandler = new Senparc.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
string sign = packageReqHandler.CreateMd5Sign("key", partnerKey);
packageReqHandler.SetParameter("sign", sign); //签名
string data = packageReqHandler.ParseXML();
var result = TenPayV3.Unifiedorder(data);
var res = XDocument.Parse(result);
prepayId = res.Element("xml").Element("prepay_id").Value;
//设置支付参数
Senparc.Weixin.MP.TenPayLibV3.RequestHandler paySignReqHandler = new Senparc.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 + "\"";
用c#开发微信 (22) 微信商城 - 微信支付 (c#源码)的更多相关文章
- 微信小程序商城 带java后台源码
微信小程序商城(Java版) 演示地址 账号:admin 密码:admin 小程序体验码: 技术选型 1 后端使用技术 1.1 springframework4.3.7.RELEASE 1.2 myb ...
- c++实现游戏开发中常用的对象池(含源码)
c++实现游戏开发中常用的对象池(含源码) little_stupid_child2017-01-06上传 对象池的五要素: 1.对象集合 2.未使用对象索引集合 3.已使用对象索引集合 4.当前 ...
- C#/ASP.NET MVC微信公众号接口开发之从零开发(三)回复消息 (附源码)
C#/ASP.NET MVC微信接口开发文章目录: 1.C#/ASP.NET MVC微信公众号接口开发之从零开发(一) 接入微信公众平台 2.C#/ASP.NET MVC微信公众号接口开发之从零开发( ...
- 微信公众平台开发-微信服务器IP接口实例(含源码)
微信公众平台开发-access_token获取及应用(含源码)作者: 孟祥磊-<微信公众平台开发实例教程> 学习了access_token的获取及应用后,正式的使用access_token ...
- Redis秒杀实战-微信抢红包-秒杀库存,附案例源码(Jmeter压测)
导读 前二天我写了一篇,Redis高级项目实战(点我直达),SpringBoot整合Redis附源码(点我直达),今天我们来做一下Redis秒杀系统的设计.当然啦,Redis基础知识还不过关的,先去加 ...
- 微信小程序demo——入门级(附源码)
最近小程序又蠢蠢欲动,出了一个公众号绑定小程序功能,目测不错,就看了下微信小程序文档,顺便写了几行代码,后续有空会持续更新维护. 源码:https://github.com/SibreiaDante/ ...
- 微信小程序实现左滑删除源码
左滑删除效果在app的交互方式中十分流行,比如全民应用微信 微信左滑删除 再比如曾引起很大反响的效率app Clear Clear左滑删除 从技术上来说,实现这个效果并不困难,响应一下滑动操作,移动一 ...
- Java开发简单的家居购物商城系统 JSP 附源码
开发环境: Windows操作系统开发工具: MyEclipse+Jdk+Tomcat+MYSQL数据库 注意:使用tomcat7运行 运行效果图 源码及原文链接:https://javadao ...
- CRMEB单商户商城系统v4.0源码,含前端uni-app源码
CRMEB商城系统是基于ThinkPhp6.0+Vue开发的一套新零售移动电商系统,CRMEB系统就是集客户关系管理+营销电商系统,能够快速积累客户.会员数据分析.智能转化客户. 有效提高销售.会员维 ...
- 【原创】基于NodeJS Express框架开发的一个VIP视频网站项目及源码分享
项目名称:视频网站项目 开发语言:HTML,CSS(前端),JavaScript,NODEJS(expres)(后台) 数据库:MySQL 开发环境:Win7,Webstorm 上线部署环境:Linu ...
随机推荐
- 在Egret实现二维码长按识别
Egret中二维码图片,是在canvas上,无法在微信上长按扫描识别. 由于微信长按识别二维码是截屏扫描原理,所以只要长按当前屏幕任意一张图片,都能够识别当前屏幕上的二维码. 这里把二维码放在ex ...
- javascript 原型详解
引:http://www.cnblogs.com/wangfupeng1988/p/3978131.html 1.什么是javascript原型 每一个函数都有prototype属性(默认生成的)和原 ...
- CentOS6 vsftpd 安装及优化方法
我在每次配置ftp的时候都会一头雾水,一直也没总结一份特别完整有效的方法出来,这次特别记录一下,以备以后使用 1.安装vsftpd yum -y install vsftpd chkconfig vs ...
- C#DataGridView中的常用技巧
0(最基本的技巧). 获取某列中的某行(某单元格)中的内容 this.currentposition = this.dataGridView1.BindingContext [this.dataG ...
- 【原】JS原型的动态性及实例与原型的关系
今天再读了<JS高程>的第六章,有了些深入的感悟和理解,总结分享一下. 创建对象的方式有很多,有一种是动态原型模式,最实用的是构造函数与原型组合的模式,原型的动态性在这两个模式里都有所体现 ...
- C语言-------多文件编译
(1)前段时间,学长讲解宏的一些知识 也提起了那个多文件编译,同过看别人的博客,自己也懂了一些,现在来总结一下这个多文件编译,其实和java里面的那个class的调用好像有联系 其定义即可以理解成: ...
- phpmyadmin
下载地址:https://www.phpmyadmin.net/ 详情:http://baike.baidu.com/link?url=OIngLv0mpiYTZl_sCEmryWkHgUYqZeHr ...
- 利用Maven建立java web项目
方法一:在IntelliJ IDEA中创建maven web项目 一.在新建项目对话框中,选择“Maven”类型,设置好jdk,勾选“create from archetype”,在列表中选择“mav ...
- reason: '-[__NSCFNumber rangeOfCharacterFromSet:]: unrecognized selector sent to instance
类型的不匹配,把类型转化对应的数据类型,例: model.price 是模型数据,其值为1550: cell.label.text = [NSString stringWithFormat:@&quo ...
- Linux系统下 解决Qt5工程打不开的方法
一.问题现象 打开Qt工程的时候,控制台报错:Could not find qmake configuration file default. 二.问题原因 我碰到这种问题的原因是我的Linux系统装 ...