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

Posted ydcnblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对接第三方接口(短信,支付)相关的知识,希望对你有一定的参考价值。

前言

第三方短信接口,支付接口广泛应用于金融领域与电商领域,这是我在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. 支付回调结果并验证商户网页(一般做法是把回调地址传给网关,在回调地址中验证支付结果)

下面附上部分代码

技术分享图片
public override bool Verify(VerifyCallBack callback)
        {
            #region =========  DEBUG  ==========

            StringBuilder sb = new StringBuilder();
            sb.AppendLine(DateTime.Now + "
");
            foreach (var keyValue in this.GetRequestGet())
            {
                sb.AppendFormat("{0}:{1}	", 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

 

 

PS:扫描下方二维码或点击链接,加入QQ群

技术分享图片

技术分享图片

以上是关于对接第三方接口(短信,支付)的主要内容,如果未能解决你的问题,请参考以下文章

第三方支付接口现号,第三方支付接口对接,第三方支付接口申请

对接第三方支付接口-类似文件锁的编程小技巧

PHP话费充值通道网站完整运营源码/全解密无授权/对接免签约支付接口

ThinkPHP3.2对接开发支付宝即时到帐接口

BTC比特币币圈金融资金盘系统定制支付通道申请第三方支付接口对接搭建 支付宝微信扫码网关网银银联快捷支付

个人项目需要发送验证码?无法对接运营商,试试第三方工具阿里云吧