服务端给手机APP写支付接口(支付宝)

本文主要介绍怎么在服务端给手机APP写支付接口:以POST的方式。

整体来说就是写一个方法罢了。

 /// 
        /// APP调用支付接口(支付宝)
        /// 
        [HttpPost]
        [Route("AliPay/{CaseId}")]
        public String AliPay([FromRoute]string Str)
        {
            String orderStr = string.Empty;

                //公共参数
                IAopClient client = new DefaultAopClient(AliPayConfigs.ServerUrl, AliPayConfigs.AppId, AliPayConfigs.merchant_private_key, AliPayConfigs.Json, AliPayConfigs.Version, AliPayConfigs.SignType, AliPayConfigs.AliPayPublicKey, AliPayConfigs.Charset, false);//参数定义在下面

                AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();

                //业务参数
                AlipayTradeAppPayModel model = new AlipayTradeAppPayModel
                {
                    Body = AliPayConfigs.Body,//商品描述
                    Subject = AliPayConfigs.Subject,// 商品名称
                    TotalAmount = AliPayConfigs.Amount,//商品金额
                    ProductCode = AliPayConfigs.ProductCode,// 销售产品码,商家和支付宝签约的产品码,为固定值QUICK_MSECURITY_PAY,
                    OutTradeNo = System.DateTime.Now.ToString("yyyymmddhhmmss") + Code(),// 订单号号,
                    TimeoutExpress = AliPayConfigs.TimeoutExpress//订单创建开始计时 "30m"
                };
                request.SetBizModel(model);
                request.SetNotifyUrl(AliPayConfigs.AliPayNotify);//商户外网可以访问的异步地址,

                try
                {
                    //这里和普通的接口调用不同,使用的是sdkExecute
                    AlipayTradeAppPayResponse response = client.SdkExecute(request);
                    orderStr = response.Body;
                    ///
                    ///这里写自己是否需要与数据库交互的代码
                    ///
                }
                catch (Exception e)
                {
                    e.ToString();
                }
           
            return orderStr;
        }

附加支付宝的订单号实现,因为订单号要唯一,所以我这里是用了时间+随机数组成,随机数方法:

 /// 
        /// 支付宝订单单号
        /// 
        /// 
        private string Code()
        {
            string RandomCode = "";

            for (int i = 0; i < 6; i++)
            {
                //获取随机数的方法
                Random rand = new Random();

                int RandKey = rand.Next(0, 10);
                RandomCode += RandKey.ToString();
            }
            return RandomCode;
        }

上面的方法就是返回给手机APP,手机APP通过得到orderStr调用支付宝进行支付;

公共参数+业务参数:

 public class AliPayConfigs
    {
        public static string alipay_public_key = "";//支付宝公钥

        public static string merchant_private_key = "";//商户私钥

        public static string merchant_public_key = "";//商户公钥

        public static string appId = "";//支付宝APPID

        public static string serverUrl = "https://openapi.alipay.com/gateway.do";

        public static string alipay_notify_url = "";//支付宝回调地址

        public static string charset = "utf-8";

        public static string sign_type = "RSA2";

        public static string json = "json";

        public static string version = "1.0";

        public static string body = "商品描述";//写商品描述

        public static string subject = "商品名称";//写商品名称

        public static string TotalAmount = "0.1";//写支付金额

        public static string ProductCode = "QUICK_MSECURITY_PAY";// 销售产品码,商家和支付宝签约的产品码,为固定值QUICK_MSECURITY_PAY,

        public static string TimeoutExpress = "2h";//订单创建开始计时

    }

到这里服务端给手机写支付宝支付接口完成一半,另一半就是回调方法的实现。

我用的是MVC来接受回调的,因此我写的回调方法也是以MVC实现的,其他框架的小伙伴也可以参考一下:

回调地址我写的是一个View的视图界面。主要实现方法也就写在了对应的控制器里面,方法如下:

POST形式来获取支付宝推送过来的支付消息:

        [HttpPost]
        public ActionResult Index()
        {
            string status = string.Empty;
            try
            {
                SortedDictionary sPara = GetRequestPost();//这个方法在下面

                if (sPara.Count > 0)//判断是否有带返回参数
                {
                    //支付宝验签方法
                    bool verifyResult = AlipaySignature.RSACheckV1(sPara, AliPayConfigs.AliPayPublicKey, AliPayConfigs.Charset, "RSA2", false);

                    if (verifyResult)//验证成功
                    {
                        //商户订单号 
                        string out_trade_no = Request.Form["out_trade_no"];
                        //支付宝交易号
                        string trade_no = Request.Form["trade_no"];
                        //交易状态
                        string trade_status = Request.Form["trade_status"];
                        //交易金额
                        string Amount = Request.Form["total_amount"];

                        if (Request.Form["trade_status"] == "TRADE_SUCCESS")
                        {
                             ///
                             ///这里写你的数据库逻辑
                             ///
                             status = "success";//请不要修改或删除 
                        }
                        else//验证失败
                        {
                            status = "fail";
                        }
                    }
                    else
                    {
                        status = "fail";
                    }
                }
                else
                {
                    status = "fail";
                }
                return Content(status);
            }
            catch (Exception ex)
            {
                Log.WriteLogFile(ex.ToString());

                return Content("fail");
            }
        }






 /// 
        /// 获取支付宝POST过来通知消息,并以“参数名=参数值”的形式组成数组
        /// 
        /// request回来的信息组成的数组
        public SortedDictionary GetRequestPost()
        {
            int i = 0;
            SortedDictionary sArray = new SortedDictionary();
            NameValueCollection coll = new NameValueCollection();
            foreach (var item in Request.Form)
            {
                coll.Add(item.Key, item.Value);
            }
            String[] requestItem = coll.AllKeys;

            for (i = 0; i < requestItem.Length; i++)
            {
                sArray.Add(requestItem[i], Request.Form[requestItem[i]]);
            }
            return sArray;
        }






到了这里,表示支付宝服务端的功能全部完成。

你可能感兴趣的:(服务端给手机APP写支付接口(支付宝))