ASP微信支付V3支付让更多ASP新老项目更加方便做社交电商

ASP微信支付(V3支付)让更多ASP新老项目更加方便做社交电商。很多asp老项目一直运营的比较好,也不愿意去更换技术,今天我用我整理的常用WeixinDLL组件给大家讲解微信支付过程。

准备工作:

1、注册微信服务号(一定要认证)、开通微信支付

2、安装微信支付安全证书

此处介绍微信V3支付,一共是用三个执行文件代码进行讲解!

1、toPay.asp     发起支付

2、pay_ok.asp  支付成功页

3、notify.asp      支付成功过程微信服务器与我们的服务器通信,将支付结果数据推送到我们服务器上

页面:toPay.asp

  1 <%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
  2 
  3 <%
  4  On Error Resume Next
  5  Dim notify_url,redirect_url,payapiurl,attach
  6  notify_url      = "https://www.domain.com/pay/notify.asp"     '支付完成后微信将在后台发送回调处理信息,由本页面接受是否成功支付的信息
  7  redirect_url = "https://www.doman.com/pay/pay_ok.asp"        '支付完成后,跳转到本页面,用于展示订单支付提示,本页面可以自己修改
  8  payapiurl    = "https://api.mch.weixin.qq.com/pay/unifiedorder"
  9  body          = "购买元森美水果酵素" 'Trim(Request.Form("body"))             ' 商品名称
 10  total_fee    = 0.01*100 ''Trim(Request.Form("total_fee"))*100 ' 以分为单位,入库前需要除以100    
 11  openid          = OpenID 'Trim(Request.Form("openid"))        ' "oK1dP1tPcSsh6xog898yXiuGlfaI" //测试openid
 12  attach       = "OnlinePay___1212" ' 用于标记,方便在notify时进行数据库相关操作
 13  
 14  Dim WxObj,Md5Obj
 15  Set Md5Obj = Server.CreateObject("WeixinDLL.Md5Class")
 16  Set WxObj = Server.CreateObject("WeixinDLL.WeixinClass")
 17  WxObj.SetAppID      = C_AppID
 18  WxObj.SetAppSecret  = C_AppSecret
 19  WxObj.SetMchid      = C_mch_id
 20  WxObj.SetMchKey     = C_mch_key
 21  WxObj.SetSoftCodeID = C_SoftCodeID
 22  WxObj.SetMd5Obj     = Md5Obj
 23  WxObj.SetPayUrl     = payapiurl
 24 
 25  ' 通过函数获取参数
 26  Dim create_ip,timeStamp,nonce_str,out_trade_no,body,total_fee,openid,prepay_id,paySign
 27  create_ip    = WxObj.GetIP              ' 当前用户网络IP地址
 28  out_trade_no = WxObj.MakeRanNum(15)     '唯一订单号,可以自行生成 "462101281206294"
 29  timeStamp    = WxObj.ToUnixTime(now())  ' 1907-1-1 00:00:00时间戳
 30  nonce_str    = WxObj.MakeRanNumChar(12) ' 随机字符串
 31  prepay_id      = WxObj.get_prepay_id(attach, body, nonce_str, notify_url, openid, out_trade_no, total_fee)
 32  paySign      = WxObj.get_paySign(nonce_str, prepay_id, timeStamp)
 33  
 34  Set Md5Obj = Nothing
 35  Set WxObj  = Nothing
 36  If Err Then Response.Write Err.Description
 37 %>
 38 <!DOCTYPE html>
 39 <html>
 40 <head>
 41 <title>在线下单</title>
 42 <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
 43 <meta id="viewport" name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1; user-scalable=no;" />
 44 <link href="/wx/fonts/font.css" type="text/css" rel="stylesheet" />
 45 <script Language="javascript">
 46 var prepay_id="<%=prepay_id%>";
 47 var paySign="<%=paySign%>";
 48 function Pay_ok(){
 49     alert ("支付成功");
 50     self.location='<%=redirect_url%>?body=<%=body%>&total_fee=<%=total_fee%>&out_trade_no=<%=out_trade_no%>'; 
 51 }
 52 function callpay(){
 53   if(prepay_id==""){
 54      alert("提示:prepay_id获取失败、本次交易结束!");
 55   }else{
 56      WeixinJSBridge.invoke('getBrandWCPayRequest',{
 57          "appId":"<%=C_AppID%>",
 58          "timeStamp":"<%=timeStamp%>",
 59          "nonceStr":"<%=nonce_str%>",
 60          "package":"prepay_id=<%=prepay_id%>",
 61          "signType":"MD5",
 62          "paySign":"<%=paySign%>"
 63        },
 64        function(res){
 65          if(res.err_msg=="get_brand_wcpay_request:ok"){
 66            Pay_ok();
 67          }else if(res.err_msg=="get_brand_wcpay_request:cancel"){
 68            alert("提示:取消交易成功!");
 69          }else if(res.err_msg=="get_brand_wcpay_request:fail"){
 70            alert("提示:支付失败!");
 71          }else{
 72            alert(res.err_code+res.err_desc+res.err_msg);
 73          }
 74        }
 75      );
 76   }
 77 }
 78 </script>
 79 <style type="text/css">
 80 *{ margin:0;padding:0;list-style:none;word-wrap:break-word; }
 81 body { -webkit-user-select:none; -webkit-text-size-adjust:none; font-family:Helvetica; background:#eae9e6; }
 82 a,button,input,img{-webkit-touch-callout:none;outline:none;}
 83 a{text-decoration:none; color:#666666}
 84 a[class*="btn"]{display:block;height:42px;line-height:42px;color:#FFFFFF;text-align:center;border-radius:5px;}
 85 .clear { clear:both; width:100%; height:1px; }
 86 .btn-blue { background:#3D87C3;border:1px solid #1C5E93;}
 87 .btn-green { background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #43C750), color-stop(1, #31AB40));border:1px solid #2E993C;
 88 box-shadow:0 1px 0 0 #69D273 inset; height:42px; line-height:42px; margin-top:15px; }
 89 .PayInfo { border-top:1px solid rgba(0, 0, 0, 0.1);border-bottom:1px solid rgba(0, 0, 0, 0.1); padding:15px 10px; background:#fff;margin-bottom:5px; margin-top:5px; }
 90 .PayInfo .InfoLine { min-height:42px; line-height:42px; position:relative; display:block; }
 91 .PayInfo .InfoLine .txtT { width:25%; min-height:42px; line-height:42px; text-align:right; position:absolute; left:0; top:0; font-weight:bold; color:#333; }
 92 .PayInfo .InfoLine .txtS { text-align:left; text-indent:5px; min-height:42px; line-height:42px; float:left; margin-left:25%; color:#555; width:75%; }
 93 </style>
 94 </head>
 95 <body>
 96 <div class="top">
 97    在线支付
 98 </div>
 99 <div class="clear"></div>
100 
101 <div class="PayInfo">
102   <div class="InfoLine"><span class="txtT">单号:</span><span class="txtS"><%=out_trade_no%></span></div>
103   <div class="clear"></div>
104   <div class="InfoLine"><span class="txtT">商品:</span><span class="txtS"><%=body%></span></div>
105   <div class="clear"></div>
106   <div class="InfoLine"><span class="txtT">支付金额:</span><span class="txtS"><%=FormatNumber(total_fee*0.01,2,-1)%>元</span></div>
107   <div class="clear"></div>
108   <div class="InfoLine"><a href="javascript:callpay();" class="btn-green">确认支付</a></div>
109 </div>
110 </body>
111 </html>

 

页面:pay_ok.asp

 1 <%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
 2 <!DOCTYPE html>
 3 <html>
 4 <head>
 5 <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
 6 <meta id="viewport" name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1; user-scalable=no;" />
 7 <link href="/wx/fonts/font.css" type="text/css" rel="stylesheet" />
 8 <title>支付结果</title>
 9 <style type="text/css">
10 *{ margin:0;padding:0;list-style:none;word-wrap:break-word; }
11 body { -webkit-user-select:none; -webkit-text-size-adjust:none; font-family:Helvetica; background:#eae9e6; }
12 a,button,input,img{-webkit-touch-callout:none;outline:none;}
13 a{text-decoration:none; color:#666666}
14 a[class*="btn"]{display:block;height:42px;line-height:42px;color:#FFFFFF;text-align:center;border-radius:5px;}
15 .clear { clear:both; width:100%; height:1px; }
16 
17 .PayInfo { border-top:1px solid rgba(0, 0, 0, 0.1);border-bottom:1px solid rgba(0, 0, 0, 0.1); padding:15px 10px; background:#fff;margin-bottom:5px; margin-top:5px; }
18 .PayInfo .InfoLine { min-height:42px; line-height:42px; position:relative; display:block; }
19 .PayInfo .InfoLine .txtT { width:25%; min-height:42px; line-height:42px; text-align:right; position:absolute; left:0; top:0; font-weight:bold; color:#333; }
20 .PayInfo .InfoLine .txtS { text-align:left; text-indent:5px; min-height:42px; line-height:42px; float:left; margin-left:25%; color:#555; width:75%; }
21 .PayInfo .CashStatus { min-height:42px; line-height:42px; font-size:26px; color:#333; display:block; text-align:center; position:relative; }
22 .PayInfo .CashStatus:before { font-size:30px;color:#2E993C; } 
23 .PayInfo .viewBtm { display:block; width:100%; height:52px; line-height:52px; text-align:center; }
24 </style>
25 </head>
26 <body>
27 <div class="clear"></div>
28 <div class="PayInfo">
29   <div class="InfoLine"><span class="txtT">订单编号:</span><span class="txtS"><%=request("out_trade_no")%></span></div>
30   <div class="clear"></div>
31   <div class="InfoLine"><span class="txtT">商品名称:</span><span class="txtS"><%=request("body")%></span></div>
32   <div class="clear"></div>
33   <div class="InfoLine"><span class="txtT">下单金额:</span><span class="txtS">¥<%=FormatNumber(request("total_fee")*0.01,2,-1)%>元</span></div>
34   <div class="clear"></div>
35   <div class="font_icon font_wxpay CashStatus">下单成功!</div>
36 </div>
37 </body>
38 </html>

页面:notify.asp

 1 <%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
 2 <%
 3  Response.cachecontrol="no-cache"
 4  Response.addHeader "pragma","no-cache"
 5  Response.expires=-1
 6  Response.expiresAbsolute=now-1
 7  Response.CharSet="utf-8"
 8  Dim notifyObj
 9  Set notifyObj = New NotifyClass
10  Call notifyObj.notify_url_return()
11  Set notifyObj = Nothing
12 
13  Class NotifyClass
14    Private Sub Class_Initialize()
15    End Sub
16    ' 清空文件对象内存
17    Private Sub Class_Terminate()
18    End Sub
19    '本接口为用户支付成功后,微信后台通知结果的接口,包括Url上的参数及XML内的参数
20    '可通过产品唯一订单号和支付状态,确定用户支付成功后执行的一系列操作
21    Public Sub notify_url_return()
22       on error resume next
23       dim xml_dom,logStr:logStr = "" '生成log的内容变量
24       set xml_dom = Server.CreateObject("MSXML2.DOMDocument")
25       xml_dom.load Request
26       dim return_code,return_msg,result_code,err_code_des
27       ' 数据正常时的通用变量
28       dim openid,is_subscribe,trade_type,bank_type,total_fee,transaction_id,out_trade_no,time_end,attach
29       
30       return_code = xml_dom.getelementsbytagname("return_code").item(0).text
31       if return_code="FAIL" then
32          '协议级错误
33          return_msg = xml_dom.getelementsbytagname("return_msg").item(0).text
34          logStr = "{'error':'401','msg_type':'协议级错误','return_msg':'"&return_msg&"'}"
35       else
36          result_code = xml_dom.getelementsbytagname("result_code").item(0).text
37          if result_code="FAIL" then
38             '业务级错误
39             err_code_des = xml_dom.getelementsbytagname("err_code_des").item(0).text
40             logStr = "{'error':'402','msg_type':'业务级错误','err_code_des':'"&err_code_des&"'}"
41          else
42             if return_code="SUCCESS" and result_code="SUCCESS" then
43                 '数据正常
44                 openid = xml_dom.getelementsbytagname("openid").item(0).text
45                 is_subscribe = xml_dom.getelementsbytagname("is_subscribe").item(0).text
46                 trade_type = xml_dom.getelementsbytagname("trade_type").item(0).text
47                 bank_type = xml_dom.getelementsbytagname("bank_type").item(0).text
48                 total_fee = xml_dom.getelementsbytagname("total_fee").item(0).text
49                 transaction_id = xml_dom.getelementsbytagname("transaction_id").item(0).text
50                 out_trade_no = xml_dom.getelementsbytagname("out_trade_no").item(0).text
51                 time_end = xml_dom.getelementsbytagname("time_end").item(0).Text
52                 attach = xml_dom.getelementsbytagname("attach").item(0).Text
53                 
54                 ' 此处可以调用与数据库通信的函数
55             end if            
56          end if
57       end if
58       dim returnXml,errString
59       returnXml="<xml>"&_
60           "<return_code><![CDATA[SUCCESS]]></return_code>"&_
61           "</xml>"
62       Response.Write returnXml    '返回SUCCESS给微信
63    End Sub
64  End Class
65 %>

三个页面均用到了WeixinDLL组件,有需要的可以联系博主!

原文地址:https://www.cnblogs.com/ysk5/p/14729109.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


数组的定义 Dim MyArray MyArray = Array(1‚5‚123‚12‚98) 可扩展数组 Dim MyArray() for i = 0 to 10
\'参数: \'code:要检测的代码 \'leixing:html或者ubb \'nopic:代码没有图片时默认值
演示效果: 代码下载: 点击下载
环境:winxp sp2 ,mysql5.0.18,mysql odbc 3.51 driver 表采用 myisam引擎。access 2003  不同的地方: 
其实说起AJAX的初级应用是非常简单的,通俗的说就是客户端(javascript)与服务端(asp或php等)脚本语言的数据交互。
<% ’判断文件名是否合法 Function isFilename(aFilename)  Dim sErrorStr,iNameLength,i  isFilename=TRUE
在调用的时候加入判断就行了. {aspcms:navlist type=0 } {if:[navlist:i]<6} < li><a href=\"[navlist:link]\" target=\"_top\">[navlist:name]</a> </li>
导航栏调用 {aspcms:navlist type=0}     <a href=\"[navlist:link]\">[navlist:name]</a>
1.引入外部文件: {aspcms:template src=infobar.html} 2.二级下拉菜单 <ul class=\"nav\">
downpic.asp页面:  <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
Cookies是数据包,可以让网页具有记忆功能,在某台电脑上记忆一定的信息。Cookies的工作原理是,第一次由服务器端写入到客户端的系统中。以后每次访问这个网页,都是先由客户端将Cookies发送到服务器端,再由服务器端
很简单,在需要调用的地方用这种模式 {aspcms:content sort={aspcms:sortid} num=17 order=isrecommend}
网站系统使用ACCESS数据库时,查询时怎么比较日期和时间呢?为什么常常比较出来却是错误的呢?比如早的日期比迟的日期大?
str1=\"1235,12,23,34,123,21,56,74,1232\" str2=\"12\" 问题:如何判断str2是否存在str1中,要求准确找出12,不能找出str1中的1235、123、1232
实例为最新版本的kindeditor 4.1.5. 主要程序: <% Const sFileExt=\"jpg|gif|bmp|png\" Function ReplaceRemoteUrl(sHTML,sSaveFilePath,sFileExt)
用ASP实现搜索引擎的功能是一件很方便的事,可是,如何实现类似3721的智能搜索呢?比如,当在搜索条件框内输入“中国人民”时,自动从中提取“中国”、“人民”等关键字并在数据库内进行搜索。看完本文后,你就可以发
首先感谢ASPCMS官网注册用户xing0203的辛苦付出!一下为久忆YK网络转载原创作者xing0203的文章内容!为了让小白更加清楚的体验替换过程,久忆YK对原文稍作了修改!
数据库连接: <% set conn=server.createobject(\"adodb.connection\") conn.open \"driver={microsoft access driver (*.mdb)};dbq=\"&server.mappath(\"数据库名\")
第1步:修改plugins下的image/image.js 找到\'<input type=\"button\" class=\"ke-upload-button\" value=\"\' + lang.upload + \'\" />\',
asp函数: <% Const sFileExt=\"jpg|gif|bmp|png\" Function ReplaceRemoteUrl(sHTML,sSaveFilePath,sFileExt)