微信扫码支付(个人电脑端)
这里的扫码支付指的是个人电脑网站上面使用微信支付,也就是官方的模式二,网站是Asp.net MVC,整理如下(演示在最下方)
一、准备工作
使用的微信应用程序接口中的统一下单方法,关键的参数是'公众账号识别码(appid)','商户号(mch_id)'和'商户支付密钥(键)',所以首先要有一个审核过的公众号,并开通支付功能,然后申请商户,通过审核后得到商户号,也就是商户平台的登录名。商户支付密钥是用来签名的,确保全球资源定位器(统一资源定位符)不被篡改。进入商户平台后在应用程序接口安全中设置,是一个32位的字符串。
有这三个参数后,还有一点要注意的是交易起始时间和交易结束时间的间隔应该在五分钟以上2小时以内。不然获取支付全球资源定位器(统一资源定位符)的时候回报错。
二、生成支付二维码
有了上面的参数,接下来就是下载软件开发工具包:net SDK及示例。
可惜官方的这个示例一开始并不能运行正确。把相关dll引用手动音量调节目录下。并创建一个WxPayAPI文件夹把相关类复制过来。
然后将WxPayConfig中的相关参数设置成自己的参数,再修改GetPayUrl方法,
公共字符串订单,字符串IP){ if(order==null){ 0引发新的ArgumentNullException(' Order ');} var产品=订单订购物品。first();WxPayData data=new WxPayData();数据SetValue('appid ',WxPayConfig .APPID);数据SetValue('mch_id ',WxPayConfig .MCHID);//数据SetValue('device_info ',' iphone 4s ');数据SetValue('nonce_str ',WxPayApi .generatenencestr());数据SetValue('body ',产品.属性描述);//商品描述数据SetValue('detail ',产品。属性描述);//商品描述数据SetValue('attach ','北京分店');//附加数据数据SetValue('out_trade_no ',订单贸易编号);//随机字符串//数据。设置值('总费用',转换. ToInt32(订单订单总额* 100));//总金额数据. SetValue('total_fee ',1);//总金额数据. SetValue('spbill_create_ip ',IP);//总金额数据SetValue('time_start ',DateTime .现在。ToString(' yyyymmdhmms ');//交易起始时间数据SetValue('time_expire ',DateTime .现在。增加30分钟. ToString(' yyyymmdhmms ');//交易结束时间数据SetValue('goods_tag ','智能婴儿床');//商品标记数据SetValue('notify_url ',' http://www .xxxx。com/check out/ResultNotify’);//通知地址数据SetValue('trade_type ',' NAtive ');//交易类型数据SetValue('product_id ',产品.ProducT id);//商品身份证数据SetValue('符号),数据. MakeSign());//签名伐木工。信息('获得签名数据GetValue('符号');WxPayData结果=WxPayApi .统一订单(数据);//调用统一下单接口伐木工。信息(结果. to JSON());字符串url=结果GetValue('code_url ').ToString();//获得统一下单接口返回的二维码链接伐木工信息('支付网址: '网址);返回url}商标号码是调用WxPayApi .GenerateOutTradeNo()方法生成的,通知URL(_ l)是用户支付之后微信通知的地址。金额的单位是分,只能传(同国际组织)国际组织型或线型十进制需要转换一下。获取全球资源定位器(统一资源定位符)成功后,在负责支付的控制器中创建一个支付方法。用于显示二维码:
公共行动结果支付(字符串guid) { if(字符串IsNullOrEmpty(guid))引发新的ArgumentException(' guide ');var order=_orderService .GetOrderByGuid(新Guid(Guid));var user=_workContext .CurrentUsernative pay原生薪资=新的原生薪资();字符串url2=nativePay .GetPayUrl(订单,用户lastpaddress);视图包。二维码='/结账/制作二维码?数据=' HttpUtility .UrlEncode(url2);视图包。订单=订单;返回视图();}这里只是返回了一个url,在页面上:
img src='http:@ViewBag .二维码类='二维码'/
后台用的qrCodeEncoder生成二维码。
公共文件结果MakeQRCode(字符串数据){ if(字符串IsNullOrEmpty(数据))抛出新的ArgumentException(' data ');//初始化二维码生成工具二维码编码器二维码编码器=新二维码编码器();qrCodeEncoder .QRCodeEncodeMode=QRCodeEncoder .编码模式字节码编码器.二维码错误纠正=二维码编码器.错误_更正m。qrCodeEncoder .二维码版本=0;qrCodeEncoder .二维码标度=4;//将字符串生成二维码图片位图图像qrCodeEncoder .编码(数据,编码。默认);//保存为巴布亚新几内亚到内存流内存流ms=新内存流();图像。保存(毫秒,图像格式. JPEG);返回文件(ms.ToArray(),' image/JPEG ');}成功之后得到支付页面:
扫码后跳出支付页面:
三、回调
用户支付之后,微信会给之前预留的接口(接口不能带参数)发消息,网站在收到消息后进行验证和确认,确定之后再给微信发一个消息。详细参数和文档请看官方应用程序接口
这里还是把演示中的方法稍作改动放到了控制器里面:
公共操作结果结果通知(){//接收从微信后台邮政过来的数据流s=请求InputStreamint计数=0;字节[]缓冲区=新字节[1024];StringBuilder builder=new StringBuilder();而((计数=s.Read(缓冲区,0,1024)) 0) { builder .追加(编码. UTF8。GetString(缓冲区,0,计数));} s . Flush();关闭();处置();伐木工。信息(这个. GetType()'从微信:接收数据'构建器);//转换数据格式并验证签名WxPayData data=new WxPayData();尝试{数据.FromXml(生成器. ToString());} catch (WxPayException ex) { //若签名错误,则立即返回结果给微信支付后台WxPayData RES=new WxPayData();res.SetValue('return_code ',' FAIL ');res.SetValue('return_msg ',例如。消息);日志。错误(这GetType().' ToString(),'符号检查错误: ' RES . ToxML());回应write(RES . ToxML());回应end();}记录器。信息(这个GetType()”检查签名成功");ProcessNotify(数据);返回视图();} public void process notify(WxPayData data){ WxPayData notify data=data;//检查支付结果中交易编号是否存在if(!通知数据.IsSet(' transaction _ id '){//若交易编号不存在,则立即返回结果给微信支付后台WxPayData RES=new WxPayData();res.SetValue('return_code ',' FAIL ');res.SetValue('return_msg ','支付结果中微信订单号不存在');伐木工。错误(这GetType()”支付结果为错误: " RES . ToxML());回应write(RES . ToxML());回应end();} string transaction _ id=notify data .GetValue('transaction_id ').ToString();//查询订单,判断订单真实性if(!QueryOrder(transaction_id)) { //若订单查询失败,则立即返回结果给微信支付后台WxPayData RES=new WxPayData();res.SetValue('return_code ',' FAIL ');res.SetValue('return_msg ','订单查询失败');伐木工。错误(这GetType()”订单查询失败: " RES . ToxML());回应write(RES . ToxML());回应end();} //查询订单成功else { WxPayData RES=new WxPayData();res.SetValue('return_code ',' SUCCESS ');res.SetValue('return_msg ',' OK ');伐木工。信息(这个GetType()”订单查询成功: " RES . ToxML());SetPaymentResult(数据GetValue('out_trade_no ').ToString(),PaymentStatus .付费);回应write(RES . ToxML());回应end();} }收到确认后,我们要更新订单的状态:
公共void SetPaymentResult(字符串tradeno,PaymentStatus状态){ Logger .信息('订单号: '交易号);var order=_orderService .GetOrderByTradeNumber(交易号);如果(订单!=null) {订单.付款状态=状态;if (status==PaymentStatus .付费){订单日期=日期时间.现在;} _订单服务.UpdateOrder(订单);伐木工。信息('订单* " trade no "成功更新状态为地位);} }然后在页面上检测订单的状态,确定成功后,跳转页面。
在商户平台的后台,我们可以查询到:
总结:主要过程是这样的,因为不能在本地调试,日志调试比较费时,希望对你有帮助。接下来,研究退款(需要证明)。
演示下载:http://xiazai.jb51.net/201701/yuanma/WXPayDemo_jb51.rar
以上就是本文的全部内容。希望本文的内容能给大家的学习或工作带来一些帮助,也希望多多支持我们!
版权声明:微信扫码支付(个人电脑端)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。