对接第三方接口(短信,支付)

前言

第三方短信接口,支付接口广泛应用于金融领域与电商领域,这是我在14年工作时的一些经验总结,现在分享出来,希望能对一部分朋友有所帮助!

内容

一:对接短信接口

对接短信接口大体分为两个步骤:

1. 根据接口文档发送短信类容到短信网关;

2. 回调结果并获取短信剩余条数

考虑到一个网站可能不止一个短信网关,我使用了工厂设计模式,下面附上代码

短信网关接口

    /// <summary>
    /// 短信网关接口
    /// </summary>
    public interface ISMS
    {
        /// <summary>
        /// 短信商
        /// </summary>
        SMSProvider Provider { get; }

        /// <summary>
        /// 发送短信
        /// </summary>
        /// <param name="destnumbers">要发送到的手机号码</param>
        /// <param name="msg">要发送的内容</param>
        /// <param name="sendTime">发送时间 为null表示立刻发送</param>
        int Send(string destnumbers, string msg, out SMSStatus status, DateTime? sendTime = null);

        /// <summary>
        /// 获取余额
        /// </summary>
        int Balance();

        /// <summary>
        /// 获取上行短信内容
        /// </summary>
        /// <returns>返回null表示没有获取到上行短信</returns>
        List<SMSReply> GetReply();
    }

 

短信工厂类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.IO;
using System.ComponentModel;

using SP.Studio.IO;
using SP.Studio.Core;

namespace SP.Studio.Gateway.SMS
{
    /// <summary>
    /// 短信工厂
    /// </summary>
    public class SMSFactory
    {
        public static ISMS CreateSMS(SMSConfig config)
        {
            ISMS sms = null;
            sms = (ISMS)Activator.CreateInstance(Type.GetType("SP.Studio.Gateway.SMS." + config.Provider),
                config.UserName,
                config.Password);
            return sms;
        }
    }

    /// <summary>
    /// 短信提供商
    /// </summary>
    public enum SMSProvider : byte
    {
        /// <summary>
        /// 无供应商
        /// </summary>
        None,
        /// <summary>
        /// 单元科技
        /// </summary>
        [Description("单元科技")]
        CCell,
        /// <summary>
        /// 单元科技 接口2
        /// </summary>
        [Description("单元科技")]
        CCell2,
        /// <summary>
        /// 亿美科技
        /// </summary>
        [Description("亿美科技")]
        EMay,
        /// <summary>
        /// /// <summary>
        /// 中国网建
        /// </summary>
        [Description("中国网建")]
        WebChinese,
        /// <summary>
        /// 国都
        /// </summary>
        [Description("国都")]
        Guodu,
        /// <summary>
        /// 企信通(鑫阳创投)
        /// </summary>
        [Description("企信通")]
        YDQXT,
        /// <summary>
        /// http://sdk.entinfo.cn:8061/
        /// </summary>
        [Description("DXC")]
        DXC,
        /// <summary>
        /// 凌凯科技 http://www.zhongguowuxian.com/Item/list.asp?id=1460
        /// </summary>
        [Description("凌凯科技")]
        LingKai,
        /// <summary>
        /// 玄武科技
        /// </summary>
        [Description("玄武科技")]
        MT,
        /// <summary>
        /// 单元科技新接口
        /// </summary>
        [Description("单元科技-3")]
        CCell3,
        /// <summary>
        /// 使用短信猫发送
        /// </summary>
        [Description("短信猫")]
        Modem = 100
    }

    /// <summary>
    /// 短信息配置类
    /// </summary>
    public class SMSConfig
    {
        public SMSProvider Provider { get; set; }

        public string UserName { get; set; }

        public string Password { get; set; }

    }
}
短信工厂类

 

实例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;

using SP.Studio.Net;
using SP.Studio.Text;

using SP.Studio.Security;

using SP.Studio.Web;
namespace SP.Studio.Gateway.SMS
{
    public class LingKai : SMSBase, ISMS
    {
        public LingKai(string userName, string password)
            : base(userName, password)
        {
        }

        public SMSProvider Provider
        {
            get { return SMSProvider.LingKai; }
        }

        public int Send(string destnumbers, string msg, out SMSStatus status, DateTime? sendTime = null)
        {
            if (!WebAgent.IsMobile(destnumbers))
            {
                status = SMSStatus.Number;
                return 0;
            }
            string url = string.Format("http://sdk.zhongguowuxian.com:98/ws/BatchSend.aspx?CorpID={0}&Pwd={1}&Mobile={2}&Content={3}&Cell=&SendTime=",
                this.UserName, this.Password, destnumbers, HttpUtility.UrlEncode(msg, Encoding.GetEncoding("GB2312")));

            string result = NetAgent.DownloadData(url, Encoding.GetEncoding("GB2312"));

            //大于等于0的数字,发送成功(得到大于等于0的数字、作为取报告的id);-1、帐号未注册;-2、其他错误;-3、密码错误;-4、手机号格式不对;-5、余额不足;-6、定时发送时间不是有效的时间格式;
            //-7、请在提交信息末尾添加中文企业签名【】; -8、发送内容需在1到500个字之间;-9、 发送号码为空 

            this.SaveGateway(result);


            status = SMSStatus.Success;
            long code;
            if (long.TryParse(result, out code))
            {
                switch (code)
                {
                    case -1:
                    case -3:
                        status = SMSStatus.Account;
                        break;
                    case -2:
                    case -6:
                        status = SMSStatus.Other;
                        break;
                    case -4:
                    case -9:
                        status = SMSStatus.Number;
                        break;
                    case -5:
                        status = SMSStatus.Money;
                        break;
                    case -7:
                    case -8:
                        status = SMSStatus.Message;
                        break;
                }
            }
            else
            {
                status = SMSStatus.Other;
            }
            return status == SMSStatus.Success ? 1 : 0;
        }

        /// <summary>
        ///获取短信的剩余量
        /// </summary>
        /// <returns></returns>
        public int Balance()
        {
            string url = string.Format("http://sdk.zhongguowuxian.com:98/WS/SelSum.aspx?CorpID={0}&Pwd={1}", this.UserName, this.Password);
            string result = NetAgent.DownloadData(url,Encoding.GetEncoding("GB2312"));
            int balance;
            int.TryParse(result, out balance);
            return balance;
        }

        public List<SMSReply> GetReply()
        {
            return new List<SMSReply>();
        }
    }
}
实例

 

二:对接支付接口

对接支付接口大体步骤也分为两步,部分支付厂商可能存在小差异

1. 找到合适的支持厂商,签订协议,拿到商户code与签名私钥;

2. 根据提供对接文档Post数据跳转到支付网关;

3. 支付回调结果并验证商户网页(一般做法是把回调地址传给网关,在回调地址中验证支付结果)

下面附上部分代码

 

        /// <summary>
        /// Post数据,跳转支付网关
        /// </summary>
        public override void GoGateway()
        {
            SortedDictionary<string, string> sParaTemp = new SortedDictionary<string, string>();
            if (this.PayMethod == "bankPay")    // 如果是网银直接支付
            {
                sParaTemp.Add("defaultbank", this.defaultbank);
            }
            switch (this.Service)
            {
                case "create_partner_trade_by_buyer": //  如果是担保支付
                case "trade_create_by_buyer":   // 双功能收款
                    sParaTemp.Add("logistics_type", "POST");
                    sParaTemp.Add("logistics_fee", "0.00");
                    sParaTemp.Add("logistics_payment", "BUYER_PAY");
                    sParaTemp.Add("price", base.Money.ToString("0.00"));
                    sParaTemp.Add("quantity", "1");
                    break;
            }

            sParaTemp.Add("partner", this.Partner);
            sParaTemp.Add("_input_charset", _input_charset.ToLower());
            sParaTemp.Add("service", this.Service);
            sParaTemp.Add("payment_type", paymentType.ToString());
            sParaTemp.Add("notify_url", this.NotifyUrl);
            sParaTemp.Add("return_url", this.ReturnUrl);
            sParaTemp.Add("seller_email", this.SellerEmail);
            sParaTemp.Add("out_trade_no", base.OrderID);
            sParaTemp.Add("subject", base.Name);
            sParaTemp.Add("total_fee", base.Money.ToString("0.00"));
            sParaTemp.Add("body", base.Description);
            sParaTemp.Add("paymethod", this.PayMethod);
            sParaTemp.Add("anti_phishing_key", this.anti_phishing_key);
            sParaTemp.Add("exter_invoke_ip", this.clientIP);

            Encoding encoding = Encoding.GetEncoding(_input_charset);

            Dictionary<string, string> sPara = this.FilterPara(sParaTemp);
            //处理字符串
            string prestr = this.CreateLinkString(sPara);
            sPara.Add("sign", Sign(prestr)); //签名验证
            sPara.Add("sign_type", sign_type);

            string url = string.Format("{0}_input_charset={1}&{2}", GATEWAY, _input_charset, CreateLinkString(sPara));
            HttpContext.Current.Response.Redirect(url);
        }


        public override bool Verify(VerifyCallBack callback)
        {
            #region =========  DEBUG  ==========

            StringBuilder sb = new StringBuilder();
            sb.AppendLine(DateTime.Now + "\n");
            foreach (var keyValue in this.GetRequestGet())
            {
                sb.AppendFormat("{0}:{1}\t", keyValue.Key, keyValue.Value);
            }
            sb.AppendLine().AppendLine("------------------------");
            if (HttpContext.Current != null)
                System.IO.File.AppendAllText(HttpContext.Current.Server.MapPath("~/App_Data/Alipay.log"), sb.ToString(), Encoding.UTF8);

            #endregion

            SortedDictionary<string, string> inputPara = this.GetRequestGet();
            string notify_id = WebAgent.GetParam("notify_id");
            string sign = WebAgent.GetParam("sign");
            string status = WebAgent.GetParam("trade_status");
            Dictionary<string, string> sPara = this.FilterPara(inputPara);
            string preSignStr = this.CreateLinkString(sPara);
            if (this.Sign(preSignStr) != sign) return false;
            if (!string.IsNullOrEmpty(notify_id))
            {
                string veryfy_url = VERYFYURL + "partner=" + this.Partner + "&notify_id=" + notify_id;
                if (NetAgent.DownloadData(veryfy_url, Encoding.GetEncoding(_input_charset)) != "true") return false;
            }
            bool isSuccess = false;
            switch (status)
            {
                case "TRADE_SUCCESS":   // 高级即时到帐状态下
                case "TRADE_FINISHED":  // 普通即时到帐状态下
                case "WAIT_SELLER_SEND_GOODS":  // 担保交易  等待卖家发货

                    isSuccess = true;
                    break;
                default:
                    isSuccess = false;
                    break;
            }
            if (isSuccess) callback.Invoke();
            return isSuccess;
        }
View Code

 

 

 

转载于:https://www.cnblogs.com/ydcnblog/p/9257901.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值