Windows应用,支付插件(为应用提供支付功能)

PayDemo

介绍

Windows应用软件,支付示例。(开发环境 Microsoft Visual Studio,编程语言C#)

1、支付插件引入

添加PayTool.cs至你的项目中

2、支付接入

 

示例demo: http://scimence.cn/src/PayDemo/PayDemo.exe

示例源码: http://scimence.cn/src/PayDemo/PayDemo_20210530.zip


附录:

PayTool.cs 

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace PayDemo
{
    // http://scimence.cn:8003/url/QRPay.html 开发者账号注册时,设置您的开发者名称
    // 添加PayTool.cs类到项目,为应用提供支付功能

    // 1、初始化,软件名称自定义,scimence修改为您自己的支付宝收款账号, 在PayResult中执行回调处理逻辑
    // PayTool.Init("PayDemo", "scimence", PayResult);    

    // 2、调用支付
    // PayTool.Pay("商品1", "0.01", "00001", "reserve");   

    /// <summary>
    /// 支付插件
    /// </summary>
    public class PayTool
    {
        public static string ServerAddress = "www.scimence.cn:8003";

        /// <summary>
        /// 调用assembly中的静态方法
        /// </summary>
        private static object RunStatic(Assembly assembly, string classFullName, string methodName, object[] args)
        {
            if (assembly == null) return null;

            Type type = assembly.GetType(classFullName, true, true);

            //object[] arg = new object[] { "参数1", "参数2" };
            object tmp = type.InvokeMember(methodName, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null, args);
            return tmp;
        }

        private static Assembly asm = null;

        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="softName">软件名称</param>
        /// <param name="authorName">软件作者</param>
        /// <param name="call">支付回调处理逻辑</param>
        public static void Init(string softName, string authorName, FunCallBack call)
        {
            if (asm == null)
            {
                asm = Assembly.Load(GetByte());
            }

            if(asm != null)
            {
                thisCall = call;
                Delegate deleg = NewDelegate(asm);

                object[] args = new object[] { softName, authorName, deleg };
                RunStatic(asm, "SciPay.PayTool", "Init", args);
            }
        }
        
        /// <summary>
        /// 调用支付
        /// </summary>
        /// <param name="productName">商品名称</param>
        /// <param name="moneyYuan">支付金额元</param>
        /// <param name="orderId">自定义订单号</param>
        /// <param name="reserve">自定义预留字段</param>
        public static void Pay(string productName, string moneyYuan, string orderId, string reserve)
        {
            if (asm != null)
            {
                object[] args = new object[] { productName, moneyYuan, orderId, reserve };
                RunStatic(asm, "SciPay.PayTool", "Pay", args);
            }
        }

        public delegate void FunCallBack(string productName, string moneyYuan, string orderId, string reserve);
        private static FunCallBack thisCall = null;
        public static void MethodF(string productName, string moneyYuan, string orderId, string reserve)
        {
            if (thisCall != null) thisCall(productName, moneyYuan, orderId, reserve);
        }

        /// <summary>
        /// 构建assembly中申明的Delegate对象
        /// </summary>
        private static Delegate NewDelegate(Assembly assembly)
        {
            string name = Assembly.GetCallingAssembly().GetName().Name;                             // 获取当前程序集名称 PayDemo
            Type methodF = Assembly.GetCallingAssembly().GetType(name + ".PayTool", true, true);    // PayDemo.PayTool类
            MethodInfo info = methodF.GetMethod("MethodF");                                         // 获取方法MethodF

            // 使用当前类的Method函数创建一个deleget,用于接收dll执行回调
            Type typeCall = assembly.GetType("SciPay.PayTool+FunCallBack", true, true);
            Delegate d = Delegate.CreateDelegate(typeCall, info);
            return d;
        }


        #region 支付插件

        public static byte[] GetByte()
        {
            string data_run = getData("http://" + ServerAddress + "/src/scitools/DATA/SciPay.data");

            byte[] bytes = ToBytes(data_run);
            return bytes;
        }

        /// <summary>  
        /// 解析字符串为Bytes数组
        /// </summary>  
        private static byte[] ToBytes(string data)
        {
            data = restore(data);
            byte[] B = new byte[data.Length / 2];
            char[] C = data.ToCharArray();

            for (int i = 0; i < C.Length; i += 2)
            {
                byte b = ToByte(C[i], C[i + 1]);
                B[i / 2] = b;
            }

            return B;
        }

        /// <summary>  
        /// 每两个字母还原为一个字节  
        /// </summary>  
        private static byte ToByte(char a1, char a2)
        {
            return (byte)((a1 - 'a') * 16 + (a2 - 'a'));
        }

        /// <summary>
        /// 从指定dataUrl载入数据,并在本地缓存
        /// </summary>
        /// <param name="dataUrl"></param>
        /// <returns></returns>
        private static string getData(string dataUrl)
        {
            string data = "";
            try
            {
                string fileName = dataUrl.Substring(dataUrl.LastIndexOf("/") + 1);
                string localPath = AppDomain.CurrentDomain.BaseDirectory + fileName;

                // 优先从本地载入数据
                if (File.Exists(localPath))
                {
                    long lastModify = new FileInfo(localPath).LastWriteTime.Ticks;
                    long secondSpace = (DateTime.Now.Ticks - lastModify) / 10000000;

                    if (secondSpace > 86400 * 1)    // 超出1天,删除缓存文件
                    {
                        File.Delete(localPath);
                    }
                    else
                    {
                        data = File.ReadAllText(localPath).Trim();
                        if (data.Trim().Equals("")) File.Delete(localPath);
                    }
                }

                // 若本地无数据,则从网址加载
                if (!File.Exists(localPath))
                {
                    System.Net.WebClient client = new System.Net.WebClient();
                    data = client.DownloadString(dataUrl).Trim();

                    File.WriteAllText(localPath, data);     // 本地缓存
                }

            }
            catch (Exception) { }
            return data;
        }

        /// <summary>
        /// 还原为原有串信息
        /// "enfkja4da6p4a4lia14ea11" -> 
        /// "enfkjaaaadaaaaaaaeaaaaaappppaaaaliaaaaaaaaaaaaaaeaaaaaaaaaaa"
        /// </summary>
        /// <param name="shrinkStr"></param>
        /// <returns></returns>
        public static string restore(string shrinkStr)
        {
            char C = ' ';
            StringBuilder builder = new StringBuilder();
            string numStr = "";

            foreach (char c in shrinkStr)
            {
                if ('a' <= c && c <= 'z')
                {
                    if (!numStr.Equals(""))
                    {
                        int n = Int32.Parse(numStr);
                        while (n-- > 1) builder.Append(C.ToString());
                        numStr = "";
                    }

                    builder.Append(c.ToString());
                    C = c;
                }
                else if ('0' <= c && c <= '9')
                {
                    numStr += c.ToString();
                }
            }

            if ('a' <= C && C <= 'z')
            {
                if (!numStr.Equals(""))
                {
                    int n = Int32.Parse(numStr);
                    while (n-- > 1) builder.Append(C.ToString());
                    numStr = "";
                }
            }

            return builder.ToString();
        }

        #endregion


    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 应用软件:应用软件是一种用于执行特定任务的软件。以下是一些应用软件的例子: 1. Microsoft Office:用于创建和编辑文档、电子表格和演示文稿的办公套件。 2. Adobe Photoshop:用于创建和编辑图像的图像处理软件。 3. Google Chrome:用于浏览互联网的网络浏览器。 4. Spotify:用于播放音乐的音乐流媒体软件。 系统软件:系统软件是一种用于管理和控制计算机系统的软件。以下是一些系统软件的例子: 1. 操作系统(例如Windows、macOS、Linux):用于管理计算机硬件和软件资源的基本软件。 2. 驱动程序:用于控制计算机硬件设备的软件。 3. 虚拟机管理程序:用于在计算机上运行虚拟机的软件。 支撑软件:支撑软件是一种用于帮助应用软件和系统软件运行的软件。以下是一些支撑软件的例子: 1. 数据库管理系统:用于存储和管理大量数据的软件。 2. 语言编译器:用于将高级编程语言转换为计算机可以理解的机器语言的软件。 3. 安全软件:用于保护计算机系统免受恶意软件和病毒的软件。 ### 回答2: 应用软件是为满足特定需求而开发的软件,主要用于完成用户具体的任务或实现特定的功能。具体的软件系统例子可以有办公软件、图像处理软件、音视频播放软件等。办公软件如Microsoft Office可以帮助用户进行文字处理、制作表格、创建演示文稿等,提高办公效率;图像处理软件如Adobe Photoshop可以用于编辑和处理照片,调整亮度、对比度等参数,实现图像的美化和修复;音视频播放软件如VLC可以播放各种音视频格式文件,提供多种播放器控制功能,方便用户观看和听取媒体内容。 系统软件是用来管理和控制计算机硬件和其他软件的软件,为其他软件提供支持和保障。具体的软件系统例子可以有操作系统、数据库管理系统、网络管理系统等。操作系统如Windows、Linux等可以管理计算机的硬件资源,为用户提供友好的交互界面,协调处理各种任务的进行;数据库管理系统如Oracle、MySQL等用于管理和组织大量数据,提供高效的数据存储、检索、修改和删除等功能;网络管理系统如Cisco的网络管理软件,可以帮助管理人员对企业网络进行管理和监控,确保网络运行的稳定性和安全性。 支撑软件是为了支持计算机系统运行和维护而开发的软件,主要包括各种工具软件和驱动程序等。具体的软件系统例子可以有杀毒软件、浏览器、数据库连接驱动等。杀毒软件如360安全卫士可以对计算机进行实时监测和防护,及时发现和清除病毒;浏览器如Google Chrome用于浏览网页,提供丰富的浏览功能插件支持;数据库连接驱动用于连接数据库和编写数据库操作程序,实现应用软件与数据库的交互。 综上所述,应用软件、系统软件和支撑软件在计算机系统中各有其独特的作用,共同为用户提供各种功能和保障。 ### 回答3: 应用软件是为了满足特定应用需求而开发的软件,常见的应用软件包括微信、支付宝、QQ等。这些应用软件通过提供各种功能和服务,满足人们在日常生活和工作中的各种需求,如即时通讯、在线支付、社交网络等。 系统软件是为了提供基本运行环境和支持应用软件的软件,常见的系统软件包括操作系统、数据库管理系统、浏览器等。操作系统是一种管理和控制计算机硬件和软件资源的软件,如Windows、MacOS、Linux等。数据库管理系统提供数据存储和管理功能,如MySQL、Oracle等。浏览器作为互联网的接入工具,如Chrome、Safari、Firefox等。 支撑软件是为了支持应用软件和系统软件的开发和运行而开发的软件,常见的支撑软件包括编程语言、集成开发环境、软件测试工具等。编程语言提供给开发人员编写应用软件和系统软件的语法和规则,如Java、C++等。集成开发环境提供了开发人员进行软件开发的工具和环境,如Eclipse、Visual Studio等。软件测试工具用于测试软件的功能、性能和可靠性等方面,如Junit、Selenium等。 总之,应用软件是为了特定的应用需求而开发的,系统软件是为了提供基本运行环境和支持应用软件的软件,支撑软件则是为了支持应用软件和系统软件的开发和运行而开发的。不同类型的软件在计算机系统中发挥着不同的作用,共同构成了完整的软件系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值