精华内容
下载资源
问答
  • 但是大家都懂,草根站长,又没公司,想找一个安全稳定的支付接口竟然不是易事。在网上也看到不少关于个人收款接口的广告和宣传,以及各种方式。现在总结一下,供大家参考,互相交流。 互联网支付形式: 1.网银支付...

    前段时间准备把自己的博客做成付费阅读或者订阅的形式,虽然没想着要赢利多少钱,但是起码养的起自己站点域名服务器费用即可。但是大家都懂,草根站长,又没公司,想找一个安全稳定的支付接口竟然不是易事。在网上也看到不少关于个人收款接口的广告和宣传,以及各种方式。现在总结一下,供大家参考,互相交流。

    互联网支付形式:

    1.网银支付:银行渠道,各种银行,特别是商业银行。不过目前这种渠道基本行不通了。

    2.第三方支付:支付宝,微信,PayPal等。

    3.第四方聚合支付:Ping++,乐惠等。

    大概也就这几种,不管是如何实现的,其实都离不开这3类的核心。也就是说,万变不离其宗。

    一、网银支付:

    先说说银行的渠道,每家银行的接入流程可能有所差别。拿建行做例子:

    提交申请资料(包含营业执照、法人身份证等)——与银行签约——银行提供结算及保证金账户——填写开户申请表——签署支付合作协议——网银中心授权并核发证书——下载证书申请密钥——完成开户。

    基本上需要上述8个步骤才能完成开户,并且,要想与银行签约,不是随便就能签的,没有量的情况下,银行几乎不予理睬,就算死缠烂打见了面,也拿不到很好的费率。并且,如果你想个人接入,对不起,没的谈。

    二、第三方支付:

    先说支付宝吧。

    支付宝是什么就不介绍了,大家都知道的。支付宝支持网站支付,H5支付,App支付和当面付,但是要想接入网站,需要网站备案,并且还要有营业执照。所以,因为资质的原因,我还是无法接入支付宝。但是经过了解,发现有另外一种途径使用支付宝,那就是有企业资质的账号,创建子账号关联,这个子账号和企业账号拥有同样的功能并且有独立管理资金的能力,一旦客户支付,企业账号收款后自动分账到子账号,但是这个要找个熟悉的企业,要不然还是有资金风险的。可是,这个途径后来经过证实,支付宝已经停用。所以,归根结底,还是要有企业资质。

    再说微信支付。

    微信支持公众号支付,APP支付,扫码支付,刷卡支付和微信买单。使用扫码支付,需要先注册公众号,然后提交企业资质认证,验证通过后,才能接入。这个也是相当的麻烦,不但要求有企业资质,还要先申请一个企业公众号,才能用微信支付,所以也作罢了。

    最后说说PayPal。

    关于PayPal,有些人可能不熟悉,这是一个全球支付的工具,比支付宝还早,具体的历史,还是自行搜索吧。

    其实PayPal是一个不错的选择,个人企业都可以接入,并且支持全球绝大多数币种。客户付款后,资金到达自己的PayPal账户,用户可以提现,但是,提现到国内的银行,需要手续费的,算下来差不多近5%的手续费。虽然API对接很方便,但是手续费有点略高,并且,PayPal有个特点就是比较偏向买家,一旦有交易纠纷或者客户不满意的地方,卖家是拿不到钱的。

    三、第四方聚合支付:

    Ping++

    就挑一个比较典型的来简单说一下好了,所谓聚合支付,就是简化了平台接入流程,适合对多个系统的对接需求,但是客户支付渠道还是需要自己去申请,所以,企业资质也是需要的。

    个人支付收款接口

    这个相对来说真的是比较麻烦,但是呢我们还是非常有需求的。比如我一开始就仅仅是想着把博客上分享的某些资源或者是某些信息,作为付费阅读的形式提供。但是研究了一下现状只有,发现这些常规办法是行不通的。

    那么个人支付收款就无法解决了?答案是否定的。

    道高一尺魔高一丈啊真是,太多的大佬想出了解救办法和对策。因为国内也就支付宝和微信这两种高频使用,其余的QQ支付京东金融等之类的,因为使用频次和线下支持以及市场行情来说没有占比太大,所以大佬们也主要是解决支付宝和微信的个人收款方式。但是解决方式也是绕不开监听和hook的方式。

    一、通过金额

    安卓端的支付宝,收款后通知栏会弹出收到XX元的通知,那么就通过技术手段监听通知栏,判定支付宝通知,获取金额信息,就有了回调能力。比如说,我一篇文章需要付费阅读,定价1元,放一个1元的二维码上去,客户扫码支付,我支付宝收款弹通知,然后告诉网站已经收到款项,接着网站展示全文给客户。

    但是,如果同一时间多用户支付了同一篇文章,这就就麻烦了,因为是相同金额,但是无法区分用户,就坏事了,要乱套。不过放心,这个时候,不得不佩服一些大佬想出的办法,如果同一时间多用户支付,那么就显示不同金额的二维码,比如A是1块,B是0.99,C是0.98这样的形式来区分。

    不过虽然解决了收款的需求,但是无法满足到更多的需求,仅仅只停留在可以收款的层面。

    缺点也是相当的明显:

    1.只有支付宝可以用这种方式,因为微信是在内部有一个公众号形式的提示。

    2.由于是通过金额区分的,那么久得提前上传N张二维码,如果我文章都定一个价格还好,但是如果有不同的价格,我的天,不敢想象需要上传二维码的数量。

    3.如果需要修改价格,那也将是一个浩大的工程,删除原有二维码,上传新的二维码。

    4.固定金额,也就是说需要事前上传好,不能方便的定价,主要还是因为二维码的数量。

    5.安全问题。怎么说呢,如果是开源的或者自己写的还好,如果是用别人的,也不知道到底是不是只监听通知栏?

    6.需要一台手机24小时开机专门做这个事情。

    7.网络延迟,哪怕你手机距离WiFi多近,路由器信号多好,你总是有网络延迟的。

    归根结底,还是因为没有原生回调接口。这一类的提供商很多,甚至自己搞一个都没问题,github上应该也是有开源的。这类方式实现收款的成本非常低,目前市面上大多数都是基于这种原理做出来的产品。代表做非常多:

    1.paysapi:虽然也说支持微信,但是需要用户上传一张收款码,客户输入金额,这体验是非常差的。

    2.虎皮椒:一模一样,没什么区别。

    3.支付吧:还是一模一样,没什么区别。

    4.xxxxx:还是一模一样,就不列举了,没区别。

    二、移动端hook

    移动端安卓平台,是一个比较开放的平台。我们运行的几乎所有软件,都是可以通过一定的手段,进行底层编程 hook,自定义其行为的。比如微信消息防撤回,摇骰子划拳作弊,自动抢红包,还有支付宝的余额 & 等级自定义装逼等功能,都是通过诸如 xposed, virtualxposed 等 hook 框架技术编程实现的。

    同样,微信和支付宝的收款二维码自动生成,包括支付成功的消息检测,也是可以通过 hook 的手段,进行编程作业的。大致流程如下:

    用户发起订单支付请求,然后移动端 hook 软件,监测到这个支付请求,获取到金额和平台(微信还是支付宝)信息。调用相关的软件,注入相关的二维码生成行为,ok,相关金额的二维码生成成功,再显示给用户。

    用户支付成功后,同样的,不论是微信,还是支付宝,都会检测到相关的支付成功信息。移动端 hook 软件,同样也可以检测到。然后进行回调。再后续,就是业务系统处理流程逻辑了。

    这种方式,比区分金额的方式要好很多,起码不需要上传大量二维码了,也支持任意金额的支付了,并且可以同时支持支付宝和微信,相对来说并发比通过金额的方式要高一点。当然缺点也太明显:

    1.需要root系统,安装一堆框架,修改系统。(我们都知道,往往解决一个事情的时候有可能会产生更多潜在的bug)

    2.风险系数高。因为hook软件可以监控到支付宝和微信的行为,甚至包括密码信息,自己想吧。

    3.风控。通过这种方式,被支付宝和微信风控的概率会非常之高,别以为他们不知道。

    4.违法。是的,没看错。如果你的互联网经验有七八年以上应该知道当年的珊瑚虫事件。所以,这种性质,比珊瑚虫事件还严重,因为涉及的是金融安全。自己想吧。

    这种方式的代表也很多:

    1.绿点支付

    2.微米富

    3.还有各种产品都一样,不一一列举了。

    三、各种二清

    二清,又称为二次结算、二次清算等。到底是什么?自己搜一下吧,这里我只说一点,二清往往与资金池是密不可分的,资金池意味着什么?混互联网的应该知道前段时间P2P等暴雷的情况,资金池意味着随时跑路。

    几乎凡是需要用户手动提现的,都是二清,当然,有些不用用户手动提现的也属于二清,具体的还是要根据问题具体分析。二清的风险就不展开说了,这个一直是央行重点打击的。有兴趣的朋友可以多查一下二清的严重性。18年拼多多就涉嫌二清,甚至把平安银行都差点拉下水。更多的自己去了解吧。

    结语

    那到底有没有一款产品能同时满足个人支付收款需求呢?又可以支持相对的高并发,低延迟,资金安全无风险,同时还不需要企业资质。我也想了好久,考察了很多,潜心分析研究,终于有这样产品出现了。

    如果你跟我有同样的需求,可以了解一下:https://www.payjz.cn

    下一篇我会具体的,详细的写一下PayJZ到底是怎样的一种渠道。保证你可以放弃本文里讲的那些各种low形式实现个人收款的产品。See you~

    展开全文
  • Xamarin.Forms C#微信支付宝支付接口(手机端)

    千次阅读 热门讨论 2019-05-06 17:19:13
    Xamarin.Forms 微信支付宝支付接口 背景 接口实现 Xamarin.Forms 微信支付宝支付接口 背景 服务端已写好的,这里的是手机端的调用。 SDK 已转译好了,==...

     

     

     

    目录

    Xamarin.Forms 微信支付宝支付接口

    背景

     接口实现

     

    Xamarin.Forms 微信支付宝支付接口

    背景

    服务端已写好的,这里的是手机端的调用。

    SDK 已转译好了,==https://download.csdn.net/download/qq_21121397/11501649==

    接口实现

    微信接口

    1. 在xamarin.forms工程中添加接口

     

        public interface IWeChat
        {
            void WXPay(Xamarin.AppFramework.WxPayReqItem req); 
       }
     

     

     

    1.1  微信支付请求参数的构成:以下代码using内容一样

      
    using System;
    using System.Collections.Generic;
    using System.Text;
    using Newtonsoft.Json;
      /// <summary>
        /// 微信客户端付款请求参数:从服务器返回的。
        /// 字段名称根据服务端定义的参数自行修改
        /// </summary>
        public class WxPayReqItem
        {
            public string prepay_id { get; set; }
            public string nonceStr { get; set; }
            public string sign
            {
                get
                {
                    return WxInfo.SecSign(prepay_id, nonceStr,timestamp);
                }
            }
            public string timestamp
            {
                get
                {
                    TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
                    return Convert.ToInt64(ts.TotalSeconds).ToString();
                }
            }
     
            public string timestamp
            {
                get
                {
                    TimeSpan ts = operatedate - new DateTime(1970, 1, 1, 0, 0, 0, 0);
                    return Convert.ToInt64(ts.TotalSeconds).ToString();
                }
            }
            /// <summary>
            /// 时间戳
            /// </summary>
            [JsonIgnore]
            public DateTime operatedate { get; set; }
    
        }
        /// <summary>
        /// 微信信息
        /// </summary>
        public class WxInfo
        {
            /// <summary>
            /// 微信appid
            /// </summary>
            public static string AppId =  "";
    
            /// <summary>
            /// 商户号
            /// </summary>
            public static string PartnerId = " ";
    
            /// <summary>
            /// /商户平台API密钥
            /// </summary>
            public static string outkey = " ";
    
    
            /// <summary>
            /// 支付结果回调 ,回调结果里面带上支付方式和支付标志。
            /// </summary>
            public static AsyncMsg am_支付结果 = new AsyncMsg();
    
            public static WxUserInfo wxUserInfo = new WxUserInfo();
    
            /// <summary>
            /// 微信支付签名算法
            /// </summary>
            /// <param name="parameters"></param>
            /// <returns></returns>
            static string GetSignContent(IDictionary<string, string> parameters)
            {
                // 第一步:把字典按Key的字母顺序排序
                IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters);
                IEnumerator<KeyValuePair<string, string>> dem = sortedParams.GetEnumerator();
                // 第二步:把所有参数名和参数值串在一起
                StringBuilder query = new StringBuilder("");
                while (dem.MoveNext())
                {
                    string key = dem.Current.Key;
                    string value = dem.Current.Value;
                    if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(value))
                    {
                        query.Append(key).Append("=").Append(value).Append("&");
                    }
                }
                string content = query.ToString().Substring(0, query.Length - 1);
                return content;
            }
    
            /// <summary>
            /// 微信支付二次签名
            /// </summary>
            /// <param name="str"></param>
            /// <returns></returns>
            public static string SecSign(string prepayid, string noncestr,string timestamp)
            {
                //二次签名
                Dictionary<string, string> parameters1 = new Dictionary<string, string>();
                parameters1.Add("appid", AppId);
                parameters1.Add("partnerid", PartnerId);
                parameters1.Add("prepayid", prepayid);
                parameters1.Add("noncestr", noncestr);
                parameters1.Add("timestamp", timestamp);
                parameters1.Add("package", "Sign=WXPay");
                string content = GetSignContent(parameters1);
                //,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
                //stringSignTemp=stringA+"&key=192006250b4c09247ec02edce69f6a2d" //注:key为商户平台设置的密钥key 
                string signResult =Xamarin.AppFramework.Helpers.CryptHelper.GetMD5(content + "&key=" + outkey).ToUpper();
                return signResult;
            }
        }
    
    
    
    
    
        /// <summary>
        /// 微信用户信息
        /// </summary>
        /// <returns></returns>
        public class WxUserInfo
        {
            /// <summary>
            /// 用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。
            /// </summary>
            public string subscribe { get; set; }
    
            /// <summary>
            /// 用户的标识,对当前公众号唯一
            /// </summary>
            public string openid { get; set; }
    
            /// <summary>
            /// 用户的昵称
            /// </summary>
            public string nickname { get; set; }
    
            /// <summary>
            /// 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
            /// </summary>
            public string sex { get; set; }
    
            /// <summary>
            /// 用户所在城市
            /// </summary>
            public string city { get; set; }
            /// <summary>
            /// 用户所在国家
            /// </summary>
            public string country { get; set; }
            /// <summary>
            /// 用户所在省份
            /// </summary>
            public string province { get; set; }
            /// <summary>
            /// 用户的语言,简体中文为zh_CN
            /// </summary>
            public string language { get; set; }
    
            /// <summary>
            /// 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。
            /// 例子:http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0
            /// </summary>
            public string headimgurl { get; set; }
    
            /// <summary>
            /// 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间
            /// </summary>
            public string subscribe_time { get; set; }
            /// <summary>
            /// 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。
            /// </summary>
            public string unionid { get; set; }
            /// <summary>
            /// 公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注
            /// </summary>
            public string remark { get; set; }
            /// <summary>
            /// 用户所在的分组ID(兼容旧的用户分组接口)
            /// </summary>
            public string groupid { get; set; }
            /// <summary>
            /// 用户被打上的标签ID列表
            /// </summary>
            public string tagid_list { get; set; }
    
            /// <summary>
            /// 返回用户关注的渠道来源,ADD_SCENE_SEARCH 公众号搜索,ADD_SCENE_ACCOUNT_MIGRATION 公众号迁移,
            /// ADD_SCENE_PROFILE_CARD 名片分享,ADD_SCENE_QR_CODE 扫描二维码,
            /// ADD_SCENEPROFILE LINK 图文页内名称点击,ADD_SCENE_PROFILE_ITEM 图文页右上角菜单,
            /// ADD_SCENE_PAID 支付后关注,ADD_SCENE_OTHERS 其他
            /// </summary>
            public string subscribe_scene { get; set; }
    
            /// <summary>
            /// 二维码扫码场景(开发者自定义)
            /// </summary>
            public string qr_scene { get; set; }
    
            /// <summary>
            /// 二维码扫码场景描述(开发者自定义)
            /// </summary>
            public string qr_scene_str { get; set; }
    
        }
    

    上面用到了MD5加密:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Security.Cryptography;
    
    namespace Xamarin.AppFramework.Helpers
    {
        public class CryptHelper
        {
            private static readonly MD5 md5Hasher = MD5.Create();
            public static string CreateMD5(string text)
            {
                // Convert the input string to a byte array and compute the hash.
                byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(text));
    
                // Create a new Stringbuilder to collect the bytes
                // and create a string.
                StringBuilder sBuilder = new StringBuilder();
    
                // Loop through each byte of the hashed data 
                // and format each one as a hexadecimal string.
                for (int i = 0; i < data.Length; i++)
                {
                    sBuilder.Append(data[i].ToString("x2"));
                }
    
                // Return the hexadecimal string.
                return sBuilder.ToString();
    
            }
            public static string GetMD5(string encypStr)
            {
                char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
                try
                {
                    byte[] btInput = System.Text.Encoding.Default.GetBytes(encypStr);
                    // 获得MD5摘要算法的 MessageDigest 对象
                    MD5 mdInst = System.Security.Cryptography.MD5.Create();
                    // 使用指定的字节更新摘要
                    mdInst.ComputeHash(btInput);
                    // 获得密文
                    byte[] md = mdInst.Hash;
                    // 把密文转换成十六进制的字符串形式
                    int j = md.Length;
                    char[] str = new char[j * 2];
                    int k = 0;
                    for (int i = 0; i < j; i++)
                    {
                        byte byte0 = md[i];
                        str[k++] = hexDigits[(int)(((byte)byte0) >> 4) & 0xf];
                        str[k++] = hexDigits[byte0 & 0xf];
                    }
                    return new string(str);
                }
                catch (Exception e)
                {
                    Console.Error.WriteLine(e.StackTrace);
                    return null;
                }
            }
        }
    }

     

    2.  android平台下实现:用到了plugin.currentActivity,需要nuget下载引用。                                                                            2.1 2.1 实现接口

    using Android.Content;
    using Android.Graphics;
    using Android.Widget;
    using AndroidHUD;
    using Com.Tencent.MM.Sdk.Modelmsg;
    using Com.Tencent.MM.Sdk.Openapi;
    using System;
    using System.IO;
    using Saobag.Droid;
     
    [assembly: Xamarin.Forms.Dependency(typeof(Interface.Droid.WeChat))]
    namespace Interface.Droid
    {
        /// <summary>
        /// 微信相关
        /// </summary>
        class WeChat :  Xamarin.AppFramework.Interface.IWeChat
        {
    
            Context CurrentContext => Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity;
            /// <summary>
            /// 微信支付
            /// </summary>
            public void WXPay(Xamarin.AppFramework.WxPayReqItem wxreq)
            {
                try
                {
                    wxapi.Droid.WXPayEntryActivity.wxpay(wxreq);
                }
                catch (Exception ex)
                {
                    Android.Widget.Toast.MakeText(CurrentContext, "支付异常:" + ex.Message, ToastLength.Long).Show();
                }
            }    
        }
    }

    2.2 微信支付及回调接口

    
    using Android.App;
    using Android.Content;
    using Android.OS;
    using Android.Widget;
    using Com.Tencent.MM.Sdk.Modelbase;
    using Com.Tencent.MM.Sdk.Openapi;
    using Com.Tencent.MM.Sdk.Modelpay;
    using Xamarin.Forms;
    
    namespace wxapi.Droid
    {
        //xamarin对于Activity的路径是根据Name来发起的, 本身命名空间和类名只是工程内部使用。
        //微信回调的根据是这里的Name: 应用包名+.wxapi.WXPayEntryActivity 构成,不能有差错,否则无法回调。
        [Activity(Label = "WXPayEntryActivity", Name = "com.cstc.Saobag.wxapi.WXPayEntryActivity", Theme = "@android:style/Theme.Translucent", LaunchMode = Android.Content.PM.LaunchMode.SingleTop, Exported = true)]
        ///微信支付回调
        public class WXPayEntryActivity : Activity, IWXAPIEventHandler
        {
            private static IWXAPI wxApi;
     
            protected override void OnCreate(Bundle savedInstanceState)
            {
                base.OnCreate(savedInstanceState);
                // Create your application here
                wxApi = WXAPIFactory.CreateWXAPI(this, Xamarin.AppFramework.WxInfo.AppId);
                wxApi.HandleIntent(Intent, this);
            }
    
     
            public void OnReq(BaseReq req)
            {
                //  throw new NotImplementedException();
            }
    
            public void OnResp(BaseResp resp)
            {
                switch (resp.MyErrCode)
                {
                    case BaseResp.ErrCode.ErrOk:
    
                        Device.BeginInvokeOnMainThread(() =>
                        {
                            Toast.MakeText(this.BaseContext, "支付成功", ToastLength.Short).Show();
                        });
    
                        Xamarin.AppFramework.WxInfo.am_支付结果.OnCompletion(null, "充值");
     
     
    
                        Finish();
                        break;
                    case BaseResp.ErrCode.ErrAuthDenied:
                       
                        Device.BeginInvokeOnMainThread(() =>
                        {
                            Toast.MakeText(this.BaseContext, "支付失败", ToastLength.Short).Show();
                        });
    
                        Xamarin.AppFramework.WxInfo.am_支付结果.OnCancel(null, "充值");
      
                        Finish();
                        break;
                    case BaseResp.ErrCode.ErrUserCancel:
                    
    
                        Device.BeginInvokeOnMainThread(() =>
                        {
                            Toast.MakeText(this.BaseContext, "取消支付", ToastLength.Short).Show();
                        });
                        Xamarin.AppFramework.WxInfo.am_支付结果.OnCancel(null, "充值");
                        
                        Finish();
                        break;
                }
            }
    
            /// <summary>
            /// 调用微信支付
            /// </summary>
            /// <param name="req"></param>
            public static void wxpay(Xamarin.AppFramework.WxPayReqItem req)
            {
                if (wxApi == null)
                {
                    //不同工程使用的时候记得修改命名空间。
                    wxApi = WXAPIFactory.CreateWXAPI(Saobag.Droid.MainActivity.mainActivity, Xamarin.AppFramework.WxInfo.AppId);
                }
                wxApi.RegisterApp(Xamarin.AppFramework.WxInfo.AppId);
    
                          PayReq payReq = new PayReq();
                payReq.AppId = Xamarin.AppFramework.WxInfo.AppId;
                payReq.PartnerId = Xamarin.AppFramework.WxInfo.PartnerId; 
                payReq.PrepayId = req.prepay_id;
                payReq.PackageValue = "Sign=WXPay";
                payReq.NonceStr = req.nonceStr;
                payReq.TimeStamp = req.timestamp;
                payReq.Sign = req.sign;
                bool isflag = wxApi.SendReq(payReq);        }
        }
    }

    2.3 支付宝android直接实现接口,处理回调值。

    using Android.Content;
    using Android.Widget;
    using System;
    using Xamarin.Forms;
    using Saobag.Droid;
    
    [assembly: Xamarin.Forms.Dependency(typeof(Interface.Droid.Ali))]
    namespace Interface.Droid
    {
        public class Ali : Xamarin.AppFramework.Interface.IAli
        {
            /// <summary>
            /// Android 实现支付宝支付
            /// </summary>
            /// <param name="orderInfo">订单信息</param>
            public void AliPay(string orderInfo)
            {
                Com.Alipay.Sdk.App.PayTask pa = new Com.Alipay.Sdk.App.PayTask(MainActivity.mainActivity);
                string result = pa.Pay(orderInfo);
    
                if (result.Contains("6001"))
                {
                    Device.BeginInvokeOnMainThread(() =>
                    {
                        Toast.MakeText(MainActivity.mainActivity, "取消支付", ToastLength.Short).Show();
                    });
    
                    Xamarin.AppFramework.AliInfo.am_支付结果.OnCancel(null, "充值");
    
                }
                else if (result.Contains("9000"))
                {
                    Device.BeginInvokeOnMainThread(() =>
                    {
                        Toast.MakeText(MainActivity.mainActivity, "支付成功", ToastLength.Short).Show();
                    });
                    Xamarin.AppFramework.AliInfo.am_支付结果.OnCompletion(null, "充值");
    
                }
                else if (result.Contains("4000"))
                {
                    Device.BeginInvokeOnMainThread(() =>
                    {
                        Toast.MakeText(MainActivity.mainActivity, "支付失败", ToastLength.Short).Show();
                    });
    
                    Xamarin.AppFramework.AliInfo.am_支付结果.OnCancel(null, "充值");
    
                }
    
    
            }
        }
    }

    3. IOS平台下实现:

    首先要配置:infolist,高级里面要添加url类型,用于支付后跳回程序。微信为appid,支付宝为scheme,也就是向支付宝申请支付填的包名

    3.1 实现接口

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    using Foundation;
    using UIKit;
    using Xamarin.Forms;
    using WeChatBinding;
    
    [assembly: Xamarin.Forms.Dependency(typeof(Interface.iOS.WeChat))]
    namespace Interface.iOS
    {
        public class WeChat :  Xamarin.AppFramework.Interface.IWeChat
        {
     
            public static WXApi WXapi;
    
     
    
            public void WXPay(Xamarin.AppFramework.WxPayReqItem req)
            {
                PayReq request = new PayReq();
                request.PartnerId = Xamarin.AppFramework.WxInfo.PartnerId;
                request.PrepayId = req.prepay_id;
                request.Package = @"Sign=WXPay";
                request.NonceStr = req.nonceStr;
                request.TimeStamp = Convert.ToUInt32(req.timestamp);
                request.Sign = req.sign;
                WXApi.SendReq(request);
            }
        }
    }
     
    using AlipaySDKBinding;
    using Xamarin.Forms;
    
    [assembly: Xamarin.Forms.Dependency(typeof(Interface.iOS.Ali))]
    namespace Interface.iOS 
    {
        public class Ali : Xamarin.AppFramework.Interface.IAli
        {
    
            /// <summary>
            /// 支付报支付
            /// </summary>
            /// <param name="orderInfo">订单明细</param>
            public void AliPay(string orderInfo)
            {
                //支付宝回调实际上不走这里的CompletionBlock,而是走appdelegate里面的openurl 
                //注意scheme需要在infolist--高级,urltype那里添加软件的标识符,这里调用传入,支付成功后才能返回软件
                AlipaySDKBinding.AlipaySDK.DefaultService.PayOrder(orderInfo, "com.cstc.sample",
                    new CompletionBlock(aa => { }));
            }
     
     
        }
     
    }

    3.2 微信回调委托

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    using Foundation;
    using UIKit;
    using WeChatBinding;
    using BigTed;
    using Xamarin.Forms;
    using System.Threading.Tasks;
    
    namespace wxapi
    {
        public class WxDelegate : WXApiDelegate
        {
     
            public override void OnReq(BaseReq req)
            {
                //base.OnReq(req); 
            }
    
            public override void OnResp(BaseResp resp)
            {
                if (resp is PayResp)
                {
                    #region 微信支付回调
                    PayResp response = (PayResp)resp;
                    switch (response.ErrCode)
                    {
                        case 0:
    
                            Show_Toast("支付成功");
     
                            Xamarin.AppFramework.WxInfo.am_支付结果.OnCompletion(null, "充值");
                            break;
                        default:
    
                            Xamarin.AppFramework.WxInfo.am_支付结果.OnCancel(null, "充值");
                            Show_Toast("支付失败");
    
                            break;
                    }
                    #endregion
                }
               }
           }
     
          
        }
    }

    3.3 支付回调

    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    using Foundation;
    using UIKit;
    using WeChatBinding;
    using BigTed;
    
    
    namespace Saobag.iOS
    {
        // The UIApplicationDelegate for the application. This class is responsible for launching the 
        // User Interface of the application, as well as listening (and optionally responding) to 
        // application events from iOS.
        [Register("AppDelegate")]
        public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
        {
            //
            // This method is invoked when the application has loaded and is ready to run. In this 
            // method you should instantiate the window, load the UI into it and then make the window
            // visible.
            //
            // You have 17 seconds to return from this method, or iOS will terminate your application.
            //
            public override bool FinishedLaunching(UIApplication app, NSDictionary options)
            {
                global::Xamarin.Forms.Forms.Init();
                Xamarin.AppFramework.MConfig.screenWidth = UIScreen.MainScreen.Bounds.Width; //屏幕宽度
    
                WXApi.RegisterApp(Xamarin.AppFramework.WxInfo.AppId);
    
                LoadApplication(new App());
    
                return base.FinishedLaunching(app, options);
            }
    
    
            /// <summary>
            /// 支付宝支付回调, IOS9.3以上
            /// </summary>
            /// <param name="app"></param>
            /// <param name="url"></param>
            /// <param name="options"></param>
            /// <returns></returns>
            public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options)
            {
                return ThirpartyResult(url);
            }
    
    
            /// <summary>
            /// 微信回调,IOS9.3以下支付宝支付回调 
            /// </summary>
            /// <param name="application"></param>
            /// <param name="url"></param>
            /// <param name="sourceApplication"></param>
            /// <param name="annotation"></param>
            /// <returns></returns>
            public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation)
            {
                return ThirpartyResult(url);
            }
    
    
            private bool ThirpartyResult(NSUrl url)
            {
                Xamarin.AppFramework.MConfig.WriteLog(url.ToString());
                if (url.Scheme.Equals(Xamarin.AppFramework.WxInfo.AppId))
                {
                    wxapi.WxDelegate d = new wxapi.WxDelegate();
                    bool b = WXApi.HandleOpenURL(url, d);
                    return b;
                }
                else if (url.Host.Equals("safepay"))
                {
                    return AliPayResult(url);
                }
                else
                    return true;
            }
    
            private bool AliPayResult(NSUrl url)
            {
                if (url.Host.Equals("safepay"))
                {
                    string resultStatus = "";
                    try
                    {
                        Xamarin.Forms.Device.BeginInvokeOnMainThread(() =>
                        {
                            AlipaySDKBinding.AlipaySDK.DefaultService.ProcessOrderWithPaymentResult(url,
                            new AlipaySDKBinding.CompletionBlock(aa =>
                            {
                                try
                                {
                                    string result = System.Web.HttpUtility.UrlDecode(url.ToString());
                                    string[] lists = result.Split("?"); //分解获取?后面的内容
                                    Xamarin.AppFramework.AliResponse user = (Xamarin.AppFramework.AliResponse)Newtonsoft.Json.JsonConvert.DeserializeObject(lists[1], typeof(Xamarin.AppFramework.AliResponse));
                                    resultStatus = user.memo.ResultStatus;
                                }
                                catch (Exception ex)
                                {
                                    BTProgressHUD.ShowToast("支付失败", true, 2000);
                                    Xamarin.AppFramework.AliInfo.am_支付结果.OnCancel(null, "支付宝支付");
                                }
    
    
                            }));
                            如果支付失败
                            if (!resultStatus.Equals("9000"))
                            {
                                BTProgressHUD.ShowToast("支付失败", true, 2000);
                                Xamarin.AppFramework.AliInfo.am_支付结果.OnCancel(null, "支付宝支付");
                            }
                            else
                            {
                                BTProgressHUD.ShowToast("支付成功", true, 2000);
                                //如果支付成功
                                Xamarin.AppFramework.AliInfo.am_支付结果.OnCompletion(null, "支付宝支付");
                            }
                        });
                    }
                    catch (Exception ex)
                    {
                        return false;
                    }
                }
                return true;
            }
        }
    }
    

     

    忘记把这个回调类补上。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Xamarin.AppFramework
    {
     
        /// <summary>
        /// 异步回调
        /// </summary>
        public class AsyncMsg
        {
            /// <summary>
            /// 委托事件
            /// </summary>
            /// <param name="tag">数据内容</param>
            /// <param name="e">消息</param>
            public delegate void AsyncMsgEventHandler(object tag, string e);
    
            /// <summary>
            /// 完成
            /// </summary>
            public event AsyncMsgEventHandler Completion;
    
            /// <summary>
            /// 取消或失败
            /// </summary>
            public event AsyncMsgEventHandler Cancel;
    
            public bool IsCompletion = false;//是否完成
            public bool IsCancel = false;//是否取消
     
            /// <summary>
            /// 
            /// </summary>
            public string Tag { get; set; } = "";
            public object TagObj { get; set; } = "";
    
    
            /// <summary>
            /// 完成时触发
            /// </summary>
            /// <param name="tag">数据内容</param>
            /// <param name="e">消息</param>
            public void OnCompletion(object tag, string e)
            {
                if (Completion != null)
                {
                    Completion(tag, e);
                    IsCompletion = true;
                }
            }
    
    
            public void OnCompletion()
            {
                OnCompletion(null, "");
            }
    
            /// <summary>
            /// 取消或失败触发
            /// </summary>
            /// <param name="tag">数据内容</param>
            /// <param name="e">消息</param>
            public void OnCancel(object tag, string e)
            {
                if (Cancel != null)
                {
                    Cancel(tag, e);
                    IsCancel = true;
                }
            }
            public void OnCancel()
            {
                OnCancel(null, "");
            }
        }
    }
    

    2020-1-2 补充说明,之前的时间戳用下面这个写法有问题,  return datime.UtcNow,每一次使用timestamp的时候,值都会发生变化,所以 sign加密时候的时间戳的值和上传的时间戳其实是不一致的,只是因为取得是秒值,所以发生错误的概率不大。今天调用了另一个业务接口,是毫秒级的,一直签名错误,发现了这个问题,所以我在上面加了一个字段operatedate,在调用的时候赋值,时间戳就不会发生变化。

            public string timestamp
            {
                get
                {
                    TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
                    return Convert.ToInt64(ts.TotalSeconds).ToString();
                }
            }
    展开全文
  • 网关是提交订单的地址 详情请看接口文档 2.上传完毕 你会发现你的登陆验证码不显示 此套程序有授权加密文件 需要生成key 3.key生成方法 主控\etc\bin\api\opt\index.php 第14行代码修改为你的主控...
  • 本文件是SHOPXO系统支付模块的文件定义,有的用户需要定义自己的支付方式,在原有的模板改容易出错,现在我找到了一个可以方便修改的文件模板,可以在此基础上设置自己的支付接口
  • 但是大家都懂,草根站长,又没公司,想找一个安全稳定的支付接口竟然不是易事。在网上也看到不少关于个人收款接口的广告和宣传,以及各种方式。现在总结一下,供大家参考,互相交流。 互联网支付形式: 1.网银支付...

    前段时间准备把自己的博客做成付费阅读或者订阅的形式,虽然没想着要赢利多少钱,但是起码养的起自己站点域名服务器费用即可。但是大家都懂,草根站长,又没公司,想找一个安全稳定的支付接口竟然不是易事。在网上也看到不少关于个人收款接口的广告和宣传,以及各种方式。现在总结一下,供大家参考,互相交流。

    互联网支付形式:

    1.网银支付:银行渠道,各种银行,特别是商业银行。不过目前这种渠道基本行不通了。 2.第三方支付:支付宝,微信,PayPal等。 3.第四方聚合支付:Ping++,乐惠等。 4.个人支付接口:分3类:1监听类,2二清类,3正规渠道类 大概也就这几种,不管是如何实现的,其实都离不开这3类的核心。也就是说,万变不离其宗。

    个人支付接口

    先说监听类:

    一、通过金额

    安卓端的支付宝,收款后通知栏会弹出收到XX元的通知,那么就通过技术手段监听通知栏,判定支付宝通知,获取金额信息,就有了回调能力。比如说,我一篇文章需要付费阅读,定价1元,放一个1元的二维码上去,客户扫码支付,我支付宝收款弹通知,然后告诉网站已经收到款项,接着网站展示全文给客户。

    但是,如果同一时间多用户支付了同一篇文章,这就就麻烦了,因为是相同金额,但是无法区分用户,就坏事了,要乱套。不过放心,这个时候,不得不佩服一些大佬想出的办法,如果同一时间多用户支付,那么就显示不同金额的二维码,比如A是1块,B是0.99,C是0.98这样的形式来区分。

    不过虽然解决了收款的需求,但是无法满足到更多的需求,仅仅只停留在可以收款的层面。 缺点也是相当的明显: 1.只有支付宝可以用这种方式,因为微信是在内部有一个公众号形式的提示。 2.由于是通过金额区分的,那么久得提前上传N张二维码,如果我文章都定一个价格还好,但是如果有不同的价格,我的天,不敢想象需要上传二维码的数量。 3.如果需要修改价格,那也将是一个浩大的工程,删除原有二维码,上传新的二维码。 4.固定金额,也就是说需要事前上传好,不能方便的定价,主要还是因为二维码的数量。 5.安全问题。怎么说呢,如果是开源的或者自己写的还好,如果是用别人的,也不知道到底是不是只监听通知栏? 6.需要一台手机24小时开机专门做这个事情。 7.网络延迟,哪怕你手机距离WiFi多近,路由器信号多好,你总是有网络延迟的。

    归根结底,还是因为没有原生回调接口。这一类的提供商很多,甚至自己搞一个都没问题,github上应该也是有开源的。这类方式实现收款的成本非常低,目前市面上大多数都是基于这种原理做出来的产品。代表做非常多: 1.xxxx:虽然也说支持微信,但是需要用户上传一张收款码,客户输入金额,这体验是非常差的。 2.xxxx:一模一样,没什么区别。 3.xxxx:还是一模一样,没什么区别。 4.xxxxx:还是一模一样,就不列举了,没区别。

    二、移动端hook

    移动端安卓平台,是一个比较开放的平台。我们运行的几乎所有软件,都是可以通过一定的手段,进行底层编程 hook,自定义其行为的。比如微信消息防撤回,摇骰子划拳作弊,自动抢红包,还有支付宝的余额 & 等级自定义装逼等功能,都是通过诸如 xposed, virtualxposed 等 hook 框架技术编程实现的。 同样,微信和支付宝的收款二维码自动生成,包括支付成功的消息检测,也是可以通过 hook 的手段,进行编程作业的。大致流程如下: 用户发起订单支付请求,然后移动端 hook 软件,监测到这个支付请求,获取到金额和平台(微信或是支付宝)信息。调用相关的软件,注入相关的二维码生成行为,ok,相关金额的二维码生成成功,再显示给用户。 用户支付成功后,同样的,不论是微信,还是支付宝,都会检测到相关的支付成功信息。移动端 hook 软件,同样也可以检测到。然后进行回调。再后续,就是业务系统处理流程逻辑了。 这种方式,比区分金额的方式要好很多,起码不需要上传大量二维码了,也支持任意金额的支付了,并且可以同时支持支付宝和微信,相对来说并发比通过金额的方式要高一点。当然缺点也太明显: 1.需要root系统,安装一堆框架,修改系统。(我们都知道,往往解决一个事情的时候有可能会产生更多潜在的bug) 2.风险系数高。因为hook软件可以监控到支付宝和微信的行为,甚至包括密码信息,自己想吧。 3.风控。通过这种方式,被支付宝和微信风控的概率会非常之高,别以为他们不知道。 4.违法。是的,没看错。如果你的互联网经验有七八年以上应该知道当年的珊瑚虫事件。所以,这种性质,比珊瑚虫事件还严重,因为涉及的是金融安全。自己想吧。 这种方式的代表也很多: 1.xxxx 2.xxxx 3.还有各种产品都一样,不一一列举了。

    再说二清类

    二清,又称为二次结算、二次清算等。到底是什么?自己搜一下吧,这里我只说一点,二清往往与资金池是密不可分的,资金池意味着什么?混互联网的应该知道前段时间P2P等暴雷的情况,资金池意味着随时跑路。只要不是由支付牌照的公司最终到你账户的,都是二清。 几乎凡是需要用户手动提现的,都是二清,当然,有些不用用户手动提现的也属于二清,具体的还是要根据问题具体分析。二清的风险就不展开说了,这个一直是央行重点打击的。有兴趣的朋友可以多查一下二清的严重性。18年拼多多就涉嫌二清,甚至把平安银行都差点拉下水。更多的自己去了解吧。

    正规渠道类

    那到底有没有一款产品能同时满足个人支付收款需求呢? 又可以支持相对的高并发,低延迟,资金安全无风险,同时还不需要企业资质,用极低的成本得到高效的回报。

    答案是有的,真正的个人支付接口:https://h5zhifu.com

    完美支持pc端扫码支付、小程序支付、公众号支付、app支付、手机h5支付,收款资金由支付宝、微信官方直接结算至个人账户,无需营业执照,个人即可申请开户,是真正的个人支付接口

    开户只需要:1身份证  2对应的银行卡(结算用)  3对应的实名认证的微信 十分钟即可开户,拥有正规的个人可用的商户号和密钥。

    结语

    所以,还是要根据个人口味,选择合适自己的食物。到底怎么选择,还需要根据自己的业务类型,没有哪个是十全十美的,又能xx又能xx,那怎么可能呢?

    文章转载原文:https://h5zhifu.com/article/5550.html

    展开全文
  • 银联支付接口常见错误总结

    千次阅读 2018-11-02 22:50:06
    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow也欢迎大家转载本...分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;... 银联支付接口常见错误总

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

    也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                   

    银联支付接口常见错误总结

    作者Attilax, 1466519819@qq.com

     

    常见接入问题及解答

    1)       开发过程中,报157错误。

    答:看下GATEID是不是写了0001,如果是的话,把0001删掉。

     

    2)       网上支付后,点提交时,页面提示:标准数据域不能为空怎么办?

       答:商户自行检查各条程序是否按照《NetPayClient 用户手册》里的内容来编写。当出现该条提示时,表示编程人员没有按照手册里的程序来编写,出现诸如拼写错误、漏输重要数据等低级错误。提醒商户自行检查以下重要参数:MerId, OrdId, TransAmt, CuryId, TransDate, TransType,及和这几个重要参数有关的所有程序。

    典型案例:

    某公司编程人员在编写时输入:

    ……
    <input type=hidden name=”cruyId” value=”156”>

    ……

    而正确的应该为:

    <input type=hidden name=”curyId” value=”156”>。由于一个单词的错误,造成数据读取时无法读取原有的重要信息,即找不到curyId所包含的重要参数造成页面提示标准数据域不能为空。

     

    3)       商户在测试过程中报“错误500”如何解决?

       答:该错误为系统错误,属于程序编写错误,测试提交地址和正式提交地址搞混导致。

    典型案例:

    程序编写时输入:

    ……

    <form action=https://payment.chinapay.com/pay/transget method=post>

    ……

    由于是测试商户,因此在action之后的内容应该为http://payment-test.chinapay.com/,即正确编写输入应该为:

    <form action=http://payment-test.chinapay.com/pay/transget method=post>。

     

    4)       商户出现-109错误怎么办?

        答:-109错误表示加密不成功,可能由多种问题导致。当前遇到的主要原因是商户在开发过程中使用的签名方式不正确,导致无法签名成功。在这里,需要提醒商户注意接口版本号的问题,20070129的版本号和20040916的版本号在开发上是不同的,采用错误的签名格式,会导致无法正确签名,请商户认真阅读操作文档第21页~25页的相关说明。

    07版本需要通过对一串字符串签名来实现。具体区别如下:

     

    接口类型

    20040916

    20070129

    发送交易

    NetPayClient for Java

    signOrder

    sign

    NetPayClient for Win32

    sign

    signData

    NetPayClient for C

    signOrder

    signData

    接收交易

    NetPayClient for Java

    verifyTransResponse

    verifyTransResponse

    NetPayClient for Win32

    check

    check

    NetPayClient for C

    verifyTransResponse

    verifyTransResponse

    遇到该错误时,可以用2.1中提到的方法,为用户检查发送代码的情况。

     

    5)       商户遇到非法长度怎么办?

        答:非法长度是由于商户在配置过程中各个参数长度未按实际要求配置导致。例如:订单号非16位,交易日期非8位,交易金额非12位,Checkvalue未生成等等,均会导致非法长度。

    发送参数具体说明如下:

    参数说明:

    String MerId    商户号,长度为15个字节的数字串,由ChinaPay或清算银行分配。

    String OrdId     订单号,长度为16个字节的数字串,由商户系统生成,失败的订单号允许重复支付。

    String TransAmt      交易金额,长度为12个字节的数字串,例如:数字串"000000001234"表示12.34元。

    String CuryId    货币代码, 长度为3个字节的数字串,目前只支持人民币,取值为"156" 。

    String TransDate     交易日期,长度为8个字节的数字串,表示格式为:YYYYMMDD。

    String TransType 交易类型,长度为4个字节的数字串,取值范围为:"0001"和"0002", 其中"0001"表示消费交易,"0002"表示退货交易。

    返回值:

    String CheckValue[256]  即NetPayClient根据上述输入参数生成的商户数字签名,长度为256字节的字符串。

     

    6)       ERRORCODE=110是怎么回事?

        答:商户页面应答或后台应答地址过长导致。后台交易接收URL,长度不要超过80个字节,如超过80个字节,即会报该错误。建议商户自行修改后台应答及页面应答地址,控制在80字节内即可。

     

    7)       ASP开发过程中AXTIVEX控件不能创建对象或动态链接库没有注册怎么办?

        答:1)让商户检查XP系统的SCRIPT是否已经更新到最新版本。2)是否正确加载了CHINAPAY.DLLCPNPC.DLL文件。同时,NETPAY.DLL必须放在SYSTEM32文件夹下。

     

    8)       开发时报非法页面是怎么回事?

        答:提交页面使用的应该是弹出窗口,如果商户使用的页面是框架接口,那在提交时页面将无法正常跳转,即会报非法页面。建议商户修改网页结构,不要尝试在页面的框架内进行窗口跳转,而使用弹出窗口方式。

     

    9)       发送交易时,其他可能遇到的报错信息。

    签名方法

    -100

    环境变量"NPCDIR"未设置

    -101

    户密钥文件不存在或无法打开

    -102

    密钥文件格式错误

    -103

    秘钥商户号和用于签名的商户号不一致

    -130

    用于签名的字符串长度为空

     

    10)   测试时,支付成功,返回商户页面时验证签名错误?

        答:首先,商户各条程序是否按照《NetPayClient 用户手册》里的内容来编写。同时要注意,在接收应答时,20070129的版本号签名方式与20040916版本号的签名方式是不一致的,需特别注意!

    典型案例:

    某公司在测试时输入:

    ……

    Chkvalue = request.getparameter(“chkvalue”)

    ……

    因为发送的参数名是ChkValue,回来取得也是ChkValue,实际上应该是checkvalue,所以传的空值,才验证通不过的。即:

    Chkvalue = request.getparameter(“checkvalue”)

    这属于没有按照手册里程序编写所产生的验证签名错误。

     

    11)   商户出现公钥初始化失败怎么办?

        答:首先商户是否是使用JAVA来进行接口开发的。如果是,请商户查看程序中是否在应该填写公钥代码处填写了商户号。

    典型案例:

    某商户的编程人员在编写程序时输入:

    ……

    Flag=key.buildKey(“808080002100999”,0”c:\winnt\\PgPubk.key”);

    ……

    而正确的应该为:

    ……

    Flag=key.buildKey(“999999999999999”,0”c:\winnt\\PgPubk.key”);

    ……

     

    12)   商户出现-118错误怎么办?

        答:一般不会出现该问题。主要原因是由于商户验签时使用的密钥不正确或者传入验签的参数有问题导致,比如测试商户使用生产商户的密钥或验签时,传入的参数不正确,无法正确验签导致。

    典型案例:

    某商户在测试系统的上线中,使用了生产商户的公钥,导致出现-118错误,替换测试商户公钥后,问题解决。

     

    13)   后台应答收不到怎么办?

        答:请检查接受应答代码是否对于应答的接收条件评判有误;在发送交易时,接收应答地址是否正确。

     

    14)   后台应答接收后,如何告知ChinaPay?

        答:WEBSEVER自动反馈通常情况,成功接收将会自动返回200的代码。所以商户无需返回任何参数。仅当OrderStatus为1001时,该交易才为成功交易,其他交易均为失败交易,商户需要自行对此进行判定,加入自己的数据库中。

     

    15)   loadlib(CHINAPAY.DLL)失败怎么办?

         Netpay.dll必须放在system32文件夹里。

     

     

     

     

    参考

    商户支付接入用户手册Ver2.5.17  (2012.9版)

     

     

     

     

               

    给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

    这里写图片描述
    展开全文
  • 当我们并发送请求时,公网的拥有者可以在路由端设置拦截器,以此来对你向服务器发送的数据进行拦截,从而对你的数据进行修改来达成某种意图(如果客户端的加密足够好,那么风险会小很多) 。而服务器返回给客户端的...
  • 介绍 由于工作需要实现商城的支付部分,而django-...将get_core_apps()部分修改为 get_core_apps(['apps.checkout'])替代原有的django-oscar的checkout模块 由于django默认的SESSION_SERIALIZER为json方式,不能处理
  • 前言:大家好,我主要使用的是Java开发语言。PHP只是略懂,但网上那些开源的基本都是PHP写的,所以我用网上开源的PHP发卡网对接了我自己用Java写的支付接口,完成整站整合,完美衔接。 ·
  • php支付宝接口官方SDK简单开发

    千次阅读 2017-12-07 13:51:59
    //获取 支付编号 支付信息 function alipay_get_pay_info($trade_no){ include('aop/AopClient.php'); include('aop/SignData.php'); include('aop/request/AlipayTradeQueryRequest.php'); $aop = new ...
  • 移动支付时代的手机和app安全设置

    千次阅读 2016-07-25 15:34:53
    进入移动互联网时代,移动支付已被大多数都市上班族所接受,逛个超市... 然而,移动支付给人民带来方便之外,同样也带来一些安全隐患,假设手机丢失了,在手机本身以及 某些 app 没有做好安全设置的情况下,坏人通过
  • 支付宝支付总结

    千次阅读 2017-10-21 11:47:12
    最近在项目中接入了微信支付和支付宝支付,总的来说没有那么坑,很多人都说文档不全什么的,确实没有面面 俱到,但是认真一步一步测试下还是妥妥的,再配合懂得后台,效率也是很高的,看了这篇文章,你也只要几分钟...
  • 最近在项目中接入了微信支付和支付宝支付,总的来说没有那么坑,很多人都说文档不全什么的,确实没有面面俱到,但是认真一步一步测试下还是妥妥的,再配合懂得后台,效率也是很高的,看了这篇文章,你也只要几分钟,...
  • 快捷支付到底是否安全,除了在现有监管条例下快捷支付是否合规以外,这实际上是近段时间四大行限制支付宝快捷支付额度、工行缩减快捷支付接口的关键问题。 在支付宝此前的一次内部分享会上,一名负责支付安全的...
  • iOS集成支付宝,支付成功之后"收不到回调"解决以下方法仅适用于支付宝sdk从 v15.1.0之前的版本 升级到 v15.1.0...原有方案:payOrder:fromScheme:callback接口,业务传入callback1,用于支付结果返回;processOrderW...
  • 微信支付分 (先享后付) 对接记录:微信支付分对接步骤填写开通支付分的申请表格 此步骤大概需要审核 1-3 个工作日; (模板 - 服务信息配置表 -【先享后付免确认】-【商户名】.xls) 填写商户信息 和回调地址 (支持三套...
  • 支付--微信公众号支付(JSAPI)

    千次阅读 2017-09-21 16:11:42
    这几天公司微信端项目结束,把微信公众号支付做个整理方便有同样功能需求的同学。先放上一份官方文档 https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php?chapter=7_1,咱们既然要做支付肯定要先了解人家的规范...
  • 了解了支付宝秘钥设置的原理之后,可更加快速的进行开发支付宝支付。在此示例一下支付宝支付较为简单的场景——电脑网站支付。这个场景对于后端开发者是比较友好的,官方的demo中已经提供了html页面,只需要进行简单...
  • iOS支付宝支付(Alipay)详细接入流程以及项目中遇到的问题分析  最近在项目中接入了微信支付和支付宝支付,总的来说没有那么坑,很多人都说文档不全什么的,确实没有面面 俱到,但是认真一步一步测试下还是...
  • 电子支付与结算总结

    千次阅读 2019-06-20 11:48:12
    电子支付与结算总结第一章 电子支付概述名词解释简答题选择判断题第二章 支付工具与支付方式名词解释简答题第三章 网上银行支付名词解释简答题第四章 电话支付名词解释简答题第五章 移动支付名词解释简答题讨论题...
  • php版本的demo修改

    2017-11-15 16:08:41
    这是在我上次传的demo的基础上,支付宝,方面自己修改成自己的demo,微信,在原有的基础上增加了h5支付。压缩包里面有详细的文档和数据库,接口等信息。这个服务我用的nodejs写的。
  • 超级链接: Java常用设计模式的实例学习系列-绪论 参考:《HeadFirst设计模式》 1.关于策略模式 策略模式是一种行为模式。 策略模式:如果某种行为拥有多种运作方式,那么把这种行为视为...本文以购物车的支付策略为...
  •  针对“为何要限制快捷支付限额”,工商银行某处长回应称,快捷支付产生初衷是为了满足网购客户小额快捷支付资金的便利性,只需要通过手机发送的支付机构的动态验证码,就可以从银行账户划转资金进行支付。...
  • android移动支付——银联支付

    千次阅读 2016-12-29 16:17:02
    包括远程支付(网上支付、短信支付),近场支付(刷卡、滴卡、pos机)。 国内的移动支付方式: 支付宝,微信,银联,百度钱包,QQ钱包,财付通,京东支付 易宝支付,快钱支付,还有一些第三方的支付什么连连支付之类的 ...
  • 学习微信小程序已经有段时间了,终于接触到小程序中一个很重要的功能——微信支付。接下来就给大家详细讲解一下微信支付功能的调用。 一想到微信支付,大家一定会去看微信小程序的API文档,没错,作为一个菜鸟我也看...
  • 这两天APP微信支付后端代码更换为微信官方的java版SDK(java_sdk_v3.0.9),更换之后APP端发起支付提示支付签名有问题,最后查看SDK源码发现,原来签名方式有问题,记得以前公司老代码加密方式都是MD5,一直是没问题...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,487
精华内容 3,794
关键字:

原有支付接口修改