版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】微信扫码支付Asp.NetMVC开发的注意事项有哪些
这篇文章主要介绍微信扫码支付Asp.NetMVC开发的注意事项有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!微信扫码支付Asp.NetMVC开发的注意事项有哪些这里的扫码支付指的是PC网站上面使用微信支付,也就是官方的模式二,网站是AMVC,整理如下。(demo在最下方)一、准备工作使用的微信API中的统一下单方法,关键的参数是‘公众账号ID(appid)’,‘商户号(mch_id)’和’商户支付密钥(KEY)‘,所以首先要有一个审核过的公众号,并开通支付功能,然后申请商户,通过审核后得到商户号,也就是商户平台的登录名。商户支付密钥是用来签名的,确保url不被篡改。进入商户平台后在API安全中设置,是一个32位的字符串。有这三个参数后,还有一点要注意的是交易起始时间和交易结束时间的间隔应该在五分钟以上2小时以内。不然获取支付url的时候回报错。二、生成支付二维码有了上面的参数,接下来就是下载SDK:.netSDK及示例。可惜官方的这个示例一开始并不能运行正确。把相关dll引用MVC目录下。并创建一个WxPayAPI文件夹把相关类复制过来。
然后将WxPayConfig中的相关参数设置成自己的参数,再修改GetPayUrl方法,
public
string
GetPayUrl(Order
order,string
ip)
{
if
(order
==
null)
{
throw
new
ArgumentNullException("order");
}
var
product
=
order.OrderItems.First();
WxPayData
data
=
new
WxPayData();
data.SetValue("appid",
WxPayConfig.APPID);
data.SetValue("mch_id",
WxPayConfig.MCHID);
//
data.SetValue("device_info",
"iphone4s");
data.SetValue("nonce_str",
WxPayApi.GenerateNonceStr());
data.SetValue("body",
product.AttributeDescription);//商品描述
data.SetValue("detail",
product.AttributeDescription);//商品描述
data.SetValue("attach",
"北京分店");//附加数据
data.SetValue("out_trade_no",
order.TradeNumber);//随机字符串
//
data.SetValue("total_fee",
Convert.ToInt32(order.OrderTotal
*
100));//总金额
data.SetValue("total_fee",
1);//总金额
data.SetValue("spbill_create_ip",ip);//总金额
data.SetValue("time_start",
DateTime.Now.ToString("yyyyMMddHHmmss"));//交易起始时间
data.SetValue("time_expire",
DateTime.Now.AddMinutes(30).ToString("yyyyMMddHHmmss"));//交易结束时间
data.SetValue("goods_tag",
"智能婴儿床");//商品标记
data.SetValue("notify_url",
"/Checkout/ResultNotify");//通知地址
data.SetValue("trade_type",
"NATIVE");//交易类型
data.SetValue("product_id",
product.ProductId);//商品ID
data.SetValue("sign",
data.MakeSign());//签名
Logger.Info("获得签名"
+
data.GetValue("sign"));
WxPayData
result
=
WxPayApi.UnifiedOrder(data);//调用统一下单接口
Logger.Info(result.ToJson());
string
url
=
result.GetValue("code_url").ToString();//获得统一下单接口返回的二维码链接
Logger.Info("pay
url:"
+
url);
return
url;
}TradeNumber是调用WxPayApi.GenerateOutTradeNo()方法生成的,notify_url是用户支付之后微信通知的地址。金额的单位是分,只能传int型或string型,decimal需要转换一下。获取url成功后,在负责支付的控制器中创建一个payment方法。用于显示二维码:
ActionResult
Payment((
ArgumentException(
order
=
_orderService.GetOrderByGuid(
user
==
url2
==
+=这里只是返回了一个url,在页面上:<img
src="@ViewBag.QRCode"
class="qrcode"
/>后台用的qrCodeEncoder生成二维码。
public
FileResult
MakeQRCode(string
data)
{
if
(string.IsNullOrEmpty(data))
throw
new
ArgumentException("data");
//初始化二维码生成工具
QRCodeEncoder
qrCodeEncoder
=
new
QRCodeEncoder();
qrCodeEncoder.QRCodeEncodeMode
=
QRCodeEncoder.ENCODE_MODE.BYTE;
qrCodeEncoder.QRCodeErrorCorrect
=
QRCodeEncoder.ERROR_CORRECTION.M;
qrCodeEncoder.QRCodeVersion
=
0;
qrCodeEncoder.QRCodeScale
=
4;
//将字符串生成二维码图片
Bitmap
image
=
qrCodeEncoder.Encode(data,
Encoding.Default);
//保存为PNG到内存流
MemoryStream
ms
=
new
MemoryStream();
image.Save(ms,
ImageFormat.Jpeg);
return
File(ms.ToArray(),
"image/jpeg");
}成功之后得到支付页面:扫码后跳出支付页面:三、回调用户支付之后,微信会给之前预留的接口(接口不能带参数)发消息,网站在收到消息后进行验证和确认,确定之后再给微信发一个消息。详细参数和文档请看官方API这里还是把demo中的方法稍作改动放到了控制器里面:
public
ActionResult
ResultNotify()
{
//接收从微信后台POST过来的数据
Stream
s
=
Request.InputStream;
int
count
=
0;
byte[]
buffer
=
new
byte[1024];
StringBuilder
builder
=
new
StringBuilder();
while
((count
=
s.Read(buffer,
0,
1024))
>
0)
{
builder.Append(Encoding.UTF8.GetString(buffer,
0,
count));
}
s.Flush();
s.Close();
s.Dispose();
Logger.Info(this.GetType()+
"Receive
data
from
:
"
+
builder);
//转换数据格式并验证签名
WxPayData
data
=
new
WxPayData();
try
{
data.FromXml(builder.ToString());
}
catch
(WxPayException
ex)
{
//若签名错误,则立即返回结果给微信支付后台
WxPayData
res
=
new
WxPayData();
res.SetValue("return_code",
"FAIL");
res.SetValue("return_msg",
ex.Message);
Log.Error(this.GetType().ToString(),
"Sign
check
error
:
"
+
res.ToXml());
Response.Write(res.ToXml());
Response.End();
}
Logger.Info(this.GetType()+
"Check
sign
success");
ProcessNotify(data);
return
View();
}
public
void
ProcessNotify(WxPayData
data)
{
WxPayData
notifyData
=
data;
//检查支付结果中transaction_id是否存在
if
(!notifyData.IsSet("transaction_id"))
{
//若transaction_id不存在,则立即返回结果给微信支付后台
WxPayData
res
=
new
WxPayData();
res.SetValue("return_code",
"FAIL");
res.SetValue("return_msg",
"支付结果中微信订单号不存在");
Logger.Error(this.GetType()+"The
Pay
result
is
error
:
"
+
res.ToXml());
Response.Write(res.ToXml());
Response.End();
}
string
transaction_id
=
notifyData.GetValue("transaction_id").ToString();
//查询订单,判断订单真实性
if
(!QueryOrder(transaction_id))
{
//若订单查询失败,则立即返回结果给微信支付后台
WxPayData
res
=
new
WxPayData();
res.SetValue("return_code",
"FAIL");
res.SetValue("return_msg",
"订单查询失败");
Logger.Error(this.GetType()+"Order
query
failure
:
"
+
res.ToXml());
Response.Write(res.ToXml());
Response.End();
}
//查询订单成功
else
{
WxPayData
res
=
new
WxPayData();
res.SetValue("return_code",
"SUCCESS");
res.SetValue("return_msg",
"OK");
Logger.Info(this.GetType()+"order
query
success
:
"
+
res.ToXml());
SetPaymentResult(data.GetValue("out_trade_no").ToString(),
PaymentStatus.Pa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年二手住房贷款合同2篇
- 2024年度建筑工程品质保障合同书版B版
- 2024版债权转让与债务豁免合同3篇
- 2024年建筑施工环境保护协议2篇
- 2024版虚拟现实游戏内容开发与授权使用合同3篇
- 住房公积金贷款合同三篇
- 平面设计服务合同三篇
- 2024年农药及肥料批发协议格式一
- 2024版环保技术与设备采购合同3篇
- 2024年二手车交易协议样本
- 公务员考试经验分享培训课件
- 红河学院《运动营养学》2022-2023学年第一学期期末试卷
- 新概念英语第二册单词表(含音标)
- 住建局条文解读新规JGJT46-2024《施工现场临时用电安全技术标准》
- 科教融汇背景下铁道车辆技术专业群课程改与革实践
- 2024安全员知识考试题(全优)
- 2024年3D打印加工合作合同
- 国家开放大学《当代中国政治制度》期末复习题
- 中学生标准学术能力诊断性测试2024-2025学年高三上学期10月月考试题 英语 含答案
- 北京市海淀区2023-2024学年五年级上学期数学期末试卷
- 走近大诗人学习通超星期末考试答案章节答案2024年
评论
0/150
提交评论