我们一个项目,客户给的支付方式是支付宝,以前没做过,新出的AlipayEasySDK,看着挺简单的,朋友就开始搞了,几天没搞出来,我就顺便去瞧瞧了,反正还没写过支付宝的,学习下。。

拿着他的代码,看了下就是nuget了一个AlipayEasySDK,然后复制阿里的例子,反正死活不通,错误:签名遭遇异常,去git上面下载alipay-easysdk/csharp

把代码拆分了下,黄色框架是错误位置,

前2个参数都是自动获取了,第三个没有值,最后一个也是获取到值的,以为是key弄错了,去阿里看了下

密匙管理-开放平台密匙

然后对着配置上面看,没什么问题,直接覆盖config数据。还是出错。。签名遭遇异常。

 

老老实实去看文档。。。下载了开发助手。这里是有生成密匙的,阿里上面的密匙都是这里生成的。

默认RSA2,我们是.net的选了非JAVA,生成,就出来两堆%!@#%!&@%#*!%@#&*%¥……¥(!&@)#!

每次生成都会更新key,选一个自己喜欢的。。。其实都长得一样。。。生成支付会自动生成2个txt文件

 

当时打开这个文件夹的时候,突然想到了,MerchantPrivateKey 参数 是私有key,然后突然感觉被坑了,TMD绝对参数错了,是要用这个才对。我又没有,反正在开发阶段,改掉。

把刚才生成的txt的公匙内容或者开发助手里的公匙内容 复制到上面公匙字符的地方,

保存会自动生成支付宝的公钥,成功之后要注意下,他上面会有一个提示,说你修改了公钥,什么时间才过期,也可以直接点过期,我当时就点了。。。去把代码原来的然后就把Config修了,

MerchantPrivateKey 一定是开发助手生成的那个一大堆的

AlipayPublicKey 就是支付宝的公钥

切记不要搞混了。

调试结果:此用户不允许自调用

应该是过了。估计是没签约吧。。。慢慢来。。。

 

2020.9.24

此用户不允许自调用 又是另外一个坑,三方服务才会报这个问题,但是原来不知道谁建的,自研也有,三方也有,接到手的appid是三方服务里的。选择自研服务,Config重新配置一次。

好吧。。错误又变了。。调用失败,原因:Insufficient Conditions,应用未绑定商户

 

2020.9.25

绑定的问题说明下不是服务商平台的三方绑定,而是开放平台下能力里面对应功能的绑定。

       

由于面对面支付没有签约,就不去研究了,试了下电脑支付,靠谱

AlipayTradePagePayResponse response = Factory.Payment.Page().Pay("test", "2234567234890", "0.01", "http://www.zfb.com/back.aspx");
        // 处理响应或异常
        if (ResponseChecker.Success(response))
        {
            Response.Write(response.Body);
            Response.Flush();
        }

 

不清楚后面还有多少坑,目前能支付,能查询了。。

2020.9.30

这里用的MVC输出支付宝支付页面,剩下交给支付宝了。

AlipayTradePagePayResponse response = Factory.Payment.Page().
                    AsyncNotify("http://www.test.cn:8008/back.aspx?UserName=cmhdl521").
                    Pay("这是一个测试支付2分钱", "2020093011380003", "0.02", "http://www.zfb.com/Home/Back");

                if (ResponseChecker.Success(response))
                {
                    return Content(response.Body);
                }
                else
                {
                    return Content("调用失败,原因:" + response.Body);
                }

回调URL,必须是公网,可以自己加参数。好像说是把get的参数,给你取出来,跟着支付宝一起post过去。返回URL好像是不行的,网上说要签名错误,要改也挺麻烦,由于不想麻烦,也不需要就这样吧。

服务器上的确接收到了。我们就可以自己做一些操作了。

 

退款也需要记录下
 

 //全退
                bool IsAll = true;
                if (IsAll)
                {
                    AlipayTradeRefundResponse response = Factory.Payment.Common().Refund("2020093011380003", "0.02");

                    if (ResponseChecker.Success(response))
                    {
                        return Content(response.Msg);//Success
                    }
                    else
                    {
                        return Content("调用失败,原因:" + response.Msg);
                    }
                }
                else//部分
                {
                    AlipayTradeRefundResponse response = Factory.Payment.Common().Optional("out_request_no", "2020093011380002-2").Refund("2020093011380003", "0.02");

                    if (ResponseChecker.Success(response))
                    {
                        return Content(response.Msg);//Success
                    }
                    else
                    {
                        return Content("调用失败,原因:" + response.Msg);
                    }
                }

全退,直接订单编号和全部金额;部分退,必须要加一个唯一识别,Optional("out_request_no", "2020093011380002-2"),不然会报失败的。退款没有回调URL,执行很块,一成功,手机就响了。

 

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐