地名: | 区域代码: |
镇级街道: | 区域代码: |
区县级市: | 电话区号: |
所在城市: | 邮政编码: |
所在省份: | 营业时间: |
城市代码: | 所属商圈: |
车牌号码: | 电话: |
所属类型: | 地址: |
在大家热切的期盼中,微信移动支付终于能面见公众。
腾讯挟用户已突破5亿之势,微信携手“同胞兄弟”财付通如火如荼向第三方支付市场进军。为吸引更多的用户,公司在微信支付还未对外公开时,就已经悄悄上线微信支付,(下一节将给大家分享微信支付开发全过程),这节将为大家分享微信支付二维码支付,就是在消费的时候,您只需要拿出手机,通过微信扫一扫,扫描我们前台的二维码,即可完成支付。整个微信二维码支付过程中的体验无法用言语来形容。
言归正卷,既然是微信二维码支付,第一步得先生成二维码,这里我直接使用的是腾讯提供的接口(微信二维码生成借口DLL下载)。有需要微信支付生成二维码源代码的,请在下方留言
生成二维码实例代码:
效果图如下:
将上面的DLL下载下来之后,在项目中添加引用,需要引入以下几个命名空间:
using System.Drawing;
using ZXing;
using ZXing.Rendering;
using ZXing.Common;
using (System.IO.MemoryStream mstream = new System.IO.MemoryStream())
{
System.Drawing.Image qrcodeImg = null;
var writer = new BarcodeWriter
{
Format = BarcodeFormat.QR_CODE,
Options = new EncodingOptions
{
Height = Height,
Width = Width,
Margin = 0
},
Renderer = (IBarcodeRenderer)Activator.CreateInstance(typeof(BitmapRenderer))
};
if (chainnID > 0 && list != null && list.Contains(chainnID))//没有权限
{
//开始签名 这里对写入二维码里面的参数进行签名,是为了防止数据被篡改
string param = string.Format("i={0}&t={1}&showwxpaytitle=1", chainnID, Com.WX.Common.GetDateTimeInt());
String URL = "http://www.wechatstyle.com";
string payUrl = string.Format("{0}/forward.aspx?{1}&sign={2}", URL, param, Com.WX.Common.Sign(param)); //支付的地址
//将支付的地址写入二维码中,用户扫二维码之后会跳转到你写入的地址
System.Diagnostics.Debug.WriteLine(payUrl);
qrcodeImg = writer.Write(payUrl);
}
else
{
qrcodeImg = writer.Write("亲,您已经远离地球了,很危险的?!");
}
qrcodeImg.Save(mstream, System.Drawing.Imaging.ImageFormat.Bmp);
Response.ClearContent();
Response.ContentType = "image/Jpeg";
Response.BinaryWrite(mstream.ToArray());
mstream.Close();
qrcodeImg.Dispose();
}
支付页面对传递过来的参数进行处理:
这个界面将数据处理好之后,将通过微信提供的API(微信支付JS核心文件
)调用微信支付输入密码界面:
支付完成后,微信将回调您的接口,推送交易数据
在notify接口中,处理微信发过来的数据:微信发过来的参数分两部分,一部分是POST中的xml数据,另一部分是从url中传过来的
//获取回调参数
NamevalueCollection namevalues = null;
string sPrivateKey = "2b6Ujngi2gqTRqJKoBP7Z7dWT5xuqgS5Az8iEZKG9";
namevalues = Request.Form.Keys.Count > 6 ? Request.Form : Request.QueryString;
Dictionary dicReceive = new Dictionary();
List lstReceiveKey = new List();
foreach (string sKey in namevalues.Keys)
{
dicReceive.Add(sKey, Request[sKey]);
}
解析POST中的参数
获取POST参数的代码
Stream inStream = Request.InputStream;
BinaryReader br = new BinaryReader(inStream, System.Text.Encoding.Default);
byte[] byteData = br.ReadBytes((int)inStream.Length);
string sXml = Common.ToUrlDecode(Encoding.Default.GetString(byteData));
解析微信支付回调提交过来的数据:
Xmldocument xmlDoc = new Xmldocument();
xmlDoc.LoadXml(sXml );
string sOpenID = xmlDoc.SelectSingleNode("xml/OpenId").InnerText;
string sAppID = xmlDoc.SelectSingleNode("xml/AppId").InnerText;
string sIsSubscribe = xmlDoc.SelectSingleNode("xml/IsSubscribe").InnerText;
string sTimeStamp = xmlDoc.SelectSingleNode("xml/TimeStamp").InnerText;
string sNonceStr = xmlDoc.SelectSingleNode("xml/NonceStr").InnerText;
String AppSignature = xmlDoc.SelectSingleNode("xml/AppSignature").InnerText;
解析之后要进行安全验证,也就是验证签名
//开始验证签名
String sToSHA = string.Format("appid={0}&appkey={1}&issubscribe={5}&noncestr={3}&openid={4}×tamp={2}", sAppID, sPrivateKey, sTimeStamp, sNonceStr, sOpenID, sIsSubscribe);
string sMySign = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sToSHA, "SHA1").ToLower();
if (sAppSignature == sMySign) //验证成功
后面就是你自己的业务处理了。业务处理完成之后就是微信支付发货了。发货在下一节微信公众平台开发中讲到!