GVKun编程网logo

php 服务端集成支付宝APP支付实例(php app支付宝支付接口)

10

最近很多小伙伴都在问php服务端集成支付宝APP支付实例和phpapp支付宝支付接口这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展.Net后台实现支付宝APP支付、.NET支付宝

最近很多小伙伴都在问php 服务端集成支付宝APP支付实例php app支付宝支付接口这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展.Net后台实现支付宝APP支付、.NET支付宝App支付接入的实例分析、android app(个人应用)怎么集成支付宝支付功能、App 集成支付宝支付接口(三)Java服务器端配置等相关知识,下面开始了哦!

本文目录一览:

php 服务端集成支付宝APP支付实例(php app支付宝支付接口)

php 服务端集成支付宝APP支付实例(php app支付宝支付接口)

支付宝支付分为了很多种场景,这里只讲述支付宝APP支付功能集成,期间遇到了特别大的坑,因此我简单描述下集成过程,并概述遇到的问题及解决方案

由于公司业务简单,只支持支付宝支付,而无需关心退款,查询等等额外功能,因此该篇内容仅仅讲述支付宝支付接口时服务端如何准备APP拉取支付订单的信息,大概流程如下

一、创建应用及配置

首先,需要到蚂蚁金服开发平台()注册应用,并获取应用ID,并配置应用,这里在配置时主要是签约,生成应用的RSA2公私钥,同时获取到支付宝提供的支付公钥等,这部分官网后台都有提示,比较简单

二、下载对应SDK

这里我是在PHP后台集成服务,因此下载的是PHP SDK,地址:

三、准备一个可以访问的真实域名

四、案例

当以上三部完成之后,此时就可以进入配置我们自己的业务代码了

4.1、组织APP支付时的支付订单信息

rush:xhtml;"> require_once (DIR.'/alipay-sdk-PHP-20171023143822/AopSdk.php');

class Alipay
{
/**

  • 应用ID
    */
    const APPID = '你的应用ID';
    /
    请填写开发者私钥去头去尾去回车,一行字符串
    /
    const RSA_PRIVATE_KEY = '应用对应开发者私钥';
    /

    请填写支付宝公钥,一行字符串
    /
    const ALIPAY_RSA_PUBLIC_KEY = '支付宝提供的公钥';
    /**
  • 支付宝服务器主动通知商户服务器里指定的页面
  • @var string
    */
    private $callback = "http://www.test.com/notify/alipay_notify.php";

/*
生成APP支付订单信息

  • @param string $orderId 商品订单ID
  • @param string $subject 支付商品的标题
  • @param string $body 支付商品描述
  • @param float $pre_price 商品总支付金额
  • @param int $expire 支付交易时间
  • @return bool|string 返回支付宝签名后订单信息,否则返回false
    */
    public function unifiedorder($orderId,$subject,$body,$pre_price,$expire){
    try{
    $aop = new \AopClient();
    $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
    $aop->appId = self::APPID;
    $aop->rsaPrivateKey = self::RSA_PRIVATE_KEY;
    $aop->format = "json";
    $aop->charset = "UTF-8";
    $aop->signType = "RSA2";
    $aop->alipayrsaPublicKey = self::ALIPAY_RSA_PUBLIC_KEY;
    //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.Trade.app.pay
    $request = new \AlipayTradeAppPayRequest();
    //SDK已经封装掉了公共参数,这里只需要传入业务参数
    $bizcontent = "{\"body\":\"{$body}\"," //支付商品描述
    . "\"subject\":\"{$subject}\"," //支付商品的标题
    . "\"out_Trade_no\":\"{$orderId}\"," //商户网站唯一订单号
    . "\"timeout_express\":\"{$expire}m\"," //该笔订单允许的最晚付款时间,逾期将关闭交易
    . "\"total_amount\":\"{$pre_price}\"," //订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
    . "\"product_code\":\"QUICK_MSecurity_PAY\""
    . "}";
    $request->setNotifyUrl($this->callback);
    $request->setBizContent($bizcontent);
    //这里和普通的接口调用不同,使用的是sdkExecute
    $response = $aop->sdkExecute($request);
    //htmlspecialchars是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题
    return htmlspecialchars($response);//就是orderString 可以直接给客户端请求,无需再做处理。
    }catch (\Exception $e){
    return false;
    }

}
}

4.2、支付宝支付成功之后异步回调处理

rush:xhtml;"> //验证签名
$aop = new \AopClient();
$aop->alipayrsaPublicKey = \Comm\Pay\Alipay::ALIPAY_RSA_PUBLIC_KEY;
$flag = $aop->rsaCheckV1($_POST,NULL,"RSA2");

//验签
if($flag){
//处理业务,并从$_POST中提取需要的参数内容
if($_POST['Trade_status'] == 'TradE_SUCCESS'
|| $_POST['Trade_status'] == 'TradE_FINISHED'){//处理交易完成或者支付成功的通知
//获取订单号
$orderId = $POST['outTrade_no'];
//交易号
$Trade_no = $_POST['Trade_no'];
//订单支付时间
$gmt_payment = $_POST['gmt_payment'];
//转换为时间戳
$gtime = strtotime($gmt_payment);

//此处编写回调处理逻辑

  1. //处理成功一定要返回 success 这7个字符组成的字符串,
  2. //die('success');//响应success表示业务处理成功,告知支付宝无需在异步<a href="https://www.jb51.cc/tag/tongzhi/" target="_blank">通知</a>

}
}

五、遇到的问题

5.1、一直报错40001=>isv.invalid-signature

为了搞清楚原因,先后多次重新生成应用的RSA2公私密钥,发现都没有作用。最后结合网上资料,才发现,原来是支付宝回调地址notifyUrl不能有 '?' 以及 ?后面加参数

5.2、支付宝异步通知成功了,但是$_POST为空

这个也花费了一点时间查找,开始做的时候就是遵照支付宝的建议使用HTTS方式请求。但这样应用后台一直通知没有参数内容。最后才想起来由于我们的应用使用了HTTS双向认证,这个原因导致支付宝的服务器回调的参数为空。最后,把回调地址改为了HTTP方式,验证通过

通过遇到的问题,首先查看支付宝的文档描述以及支付宝提供的错误码解释,实在不行就百度或者谷歌,再加上自己不断测试验证,最终一定可以解决问题

至此,支付宝APP支付这块功能完成,其他的APP退款、对账单等等功能就没继续做,不过按照支付宝官网文档以及支付宝提供的SDK,集成到自己应用也只是时间问题。

以上这篇PHP 服务端集成支付宝APP支付实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小编。

.Net后台实现支付宝APP支付

.Net后台实现支付宝APP支付

前面讨论了微信支付,接下来聊聊支付宝的APP支付(新款支付宝支付)。其实这些支付原理都一样,只不过具体到每个支付平台,所使用的支付配置参数不同,返回至支付端的下单参数也不同。

话不多说,直接上代码。

在App.Pay项目中使用NuGet管理器添加引用Alipay.AopSdk,也可以不添加引用,将官方SDK源码放至项目中。

添加完引用后,我们就可以开工了,新建文件夹AliPay,在文件夹中新建AliPayConfig类,存放支付宝APP支付所需的参数,同样,这些参数我也放在了配置文件中。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Web.Configuration;
 7 
 8 namespace App.Pay.AliPay
 9 {
10     public class AliPayConfig
11     {
12         //支付宝网关地址
13         public static string serviceUrl = WebConfigurationManager.AppSettings["aliServiceUrl"].ToString();
14 
15         //应用ID
16         public static string appId = WebConfigurationManager.AppSettings["aliAppId"].ToString();
17 
18         //开发者私钥,由开发者自己生成
19         public static string privateKey = WebConfigurationManager.AppSettings["aliPrivateKey"].ToString();
20 
21         //支付宝的应用公钥
22         public static string publicKey = WebConfigurationManager.AppSettings["aliPublicKey"].ToString();
23 
24         //支付宝的支付公钥
25         public static string payKey = WebConfigurationManager.AppSettings["aliPayKey"].ToString();
26 
27         //服务器异步通知页面路径
28         public static string notify_url = WebConfigurationManager.AppSettings["aliNotifyUrl"].ToString();
29 
30         //页面跳转同步通知页面路径
31         public static string return_url = WebConfigurationManager.AppSettings["aliReturnUrl"].ToString();
32 
33         //参数返回格式,只支持json
34         public static string format = WebConfigurationManager.AppSettings["aliFormat"].ToString();
35 
36         // 调用的接口版本,固定为:1.0
37         public static string version = WebConfigurationManager.AppSettings["aliVersion"].ToString();
38 
39         // 商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2
40         public static string signType = WebConfigurationManager.AppSettings["aliSignType"].ToString();
41 
42         // 字符编码格式 目前支持utf-8
43         public static string charset = WebConfigurationManager.AppSettings["aliCharset"].ToString();
44 
45         // false 表示不从文件加载密钥
46         public static bool keyFromFile = false;
47 
48         // 日志记录
49         public static string LogPath = WebConfigurationManager.AppSettings["AliLog"].ToString();
50     }
51 }
View Code

 支付宝支付中有个沙箱测试环境,我们可以先在沙箱环境下调通整个流程(沙箱支付宝里面的钱是虚拟的哦)。介绍一下这几个支付参数。

  ①aliServiceUrl支付宝网关地址,固定不变的,沙箱环境下用沙箱的,正式环境下用正式的。

  ②aliAppId支付宝APPID,aliPrivateKey支付宝应用私钥,aliPublicKey支付宝应用公钥,aliPayKey支付宝公钥

    aliPublicKey和aliPayKey是不一样的,一个是应用公钥,一个是支付宝公钥,回调接口中验签使用的是支付宝公钥

  ③aliNotifyUrl服务器通知,aliReturnUrl网页重定向通知(暂时没有用到)。主要使用到的还是aliNotifyUrl,买家付完款后(trade_status=WAIT_SELLER_SEND_GOODS),支付宝服务端会自动向商户后台发送支付回调通知,同样,商户在支付回调通知中修改订单相关状态,反馈给支付宝success,表示成功接收到回调,这个状态下支付宝不会再继续通知商户后台。

  ④aliFormat、aliVersion、aliSignType、aliCharset这几个参数都是固定不变的,签名的时候使用。

 1 <!--支付宝app支付-->
 2     <add key="aliServiceUrl" value=""/>
 3     <add key="aliAppId" value="" />
 4     <add key="aliPrivateKey" value=""/>
 5     <add key="aliPublicKey" value="" />
 6     <add key="aliPayKey" value="" />
 7     <add key="aliNotifyUrl" value="" />
 8     <add key="aliReturnUrl" value="" />
 9     <add key="aliFormat" value="json" />
10     <add key="aliVersion" value="1.0" />
11     <add key="aliSignType" value="RSA2" />
12     <add key="aliCharset" value="utf-8" />
View Code

新建AliPay类

 1 using Aop.Api;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 using System.Text;
 6 using System.Threading.Tasks;
 7 
 8 namespace App.Pay.AliPay
 9 {
10     public class AliPay
11     {
12         public static IAopClient GetAlipayClient()
13         {
14             string serviceUrl = AliPayConfig.serviceUrl;
15 
16             string appId = AliPayConfig.appId;
17 
18             string privateKey = AliPayConfig.privateKey;
19 
20             string publivKey = AliPayConfig.publicKey;
21 
22             string format = AliPayConfig.format;
23 
24             string version = AliPayConfig.version;
25 
26             string signType = AliPayConfig.signType;
27 
28             string charset = AliPayConfig.charset;
29 
30             bool keyFromFile = AliPayConfig.keyFromFile;
31 
32 
33             IAopClient client = new DefaultAopClient(serviceUrl, appId, privateKey, format, version, signType, publivKey, charset, keyFromFile); ;
34 
35             return client;
36         }
37     }
38 }
View Code

接下来就是业务中的具体调用

  1 using Aop.Api;
  2 using Aop.Api.Domain;
  3 using Aop.Api.Request;
  4 using Aop.Api.Response;
  5 using Aop.Api.Util;
  6 using App.Common.Extension;
  7 using App.Pay.AliPay;
  8 using System;
  9 using System.Collections.Generic;
 10 using System.Collections.Specialized;
 11 using System.Linq;
 12 using System.Web;
 13 using System.Web.Mvc;
 14 
 15 namespace App.WebTest.Controllers
 16 {
 17     public class AliPayController : BaseController
 18     {
 19         /// <summary>
 20         /// 订单编号
 21         /// </summary>
 22         /// <param name="oidStr"></param>
 23         /// <returns></returns>
 24         public ActionResult AliPay(string oidStr)
 25         {
 26             #region 验证订单有效
 27 
 28             if (string.IsNullOrEmpty(oidStr))
 29             {
 30                 return Json(false, "OrderError");
 31             }
 32 
 33             int[] oIds = Serialize.JsonTo<int[]>(oidStr);
 34 
 35             decimal payPrice = 0;
 36 
 37             ///订单验证,统计订单总金额
 38 
 39             #endregion
 40 
 41             #region 统一下单
 42             try
 43             {
 44                 var notify_url = AliPayConfig.notify_url;
 45                 var return_url = AliPayConfig.return_url;
 46                 IAopClient client = Pay.AliPay.AliPay.GetAlipayClient();
 47                 AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
 48                 //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
 49                 AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
 50                 model.Subject = "商品购买";
 51                 model.TotalAmount = payPrice.ToString("F2");
 52                 model.ProductCode = "QUICK_MSECURITY_PAY";
 53                 Random rd = new Random();
 54                 var payNum = DateTime.Now.ToString("yyyyMMddHHmmss") + rd.Next(0, 1000).ToString().PadLeft(3, ''0'');
 55                 model.OutTradeNo = payNum;
 56                 model.TimeoutExpress = "30m";
 57                 request.SetBizModel(model);
 58                 request.SetNotifyUrl(notify_url);
 59                 //request.SetReturnUrl(return_url);
 60                 //这里和普通的接口调用不同,使用的是sdkExecute
 61                 AlipayTradeAppPayResponse response = client.SdkExecute(request);
 62 
 63                 //统一下单
 64                 //OrderBll.Value.UpdateOrderApp(oIds, payNum);
 65 
 66                 return Json(true, new { response.Body }, "OK");
 67             }
 68             catch (Exception ex)
 69             {
 70                 return Json(new { Result = false, msg = "缺少参数" });
 71             }
 72             #endregion
 73         }
 74 
 75         /// <summary>
 76         /// 页面跳转同步通知页面
 77         /// </summary>
 78         /// <returns></returns>
 79         public ActionResult ReturnUrl()
 80         {
 81             Pay.Log Log = new Pay.Log(Pay.AliPay.AliPayConfig.LogPath);
 82             Log.Info("ReturnUrl", "支付页面同步回调");
 83             //将同步通知中收到的所有参数都存放到map中
 84             IDictionary<string, string> map = GetRequestGet();
 85             if (map.Count > 0) //判断是否有带返回参数
 86             {
 87                 try
 88                 {
 89                     //支付宝的公钥
 90                     string alipayPublicKey = AliPayConfig.payKey;
 91                     string signType = AliPayConfig.signType;
 92                     string charset = AliPayConfig.charset;
 93                     bool keyFromFile = false;
 94                     // 获取支付宝GET过来反馈信息  
 95                     bool verify_result = AlipaySignature.RSACheckV1(map, alipayPublicKey, charset, signType, keyFromFile);
 96                     if (verify_result)
 97                     {
 98                         // 验证成功                        
 99                         return Json(new { Result = true, msg = "验证成功" });
100                     }
101                     else
102                     {
103                         Log.Error("AliPayNotifyUrl", "支付验证失败");
104                         return Json(new { Result = false, msg = "验证失败" });
105                     }
106                 }
107                 catch (Exception e)
108                 {
109                     //throw new Exception(e.Message);
110                     return Json(new { Result = false, msg = "验证失败" });
111                     Log.Error("AliPayNotifyUrl", "支付验证失败");
112                 }
113             }
114             else
115             {
116                 return Json(new { Result = false, msg = "无返回参数" });
117             }
118         }
119 
120         /// <summary>
121         /// 服务器异步通知页面
122         /// </summary>
123         public void AliPayNotifyUrl()
124         {
125             Pay.Log Log = new Pay.Log(AliPayConfig.LogPath);
126             Log.Info("AliPayNotifyUrl", "支付页面异步回调");
127             IDictionary<string, string> map = GetRequestPost();
128 
129             if (map.Count > 0)
130             {
131                 try
132                 {
133                     string alipayPublicKey = AliPayConfig.payKey;
134                     string signType = AliPayConfig.signType;
135                     string charset = AliPayConfig.charset;
136                     bool keyFromFile = false;
137 
138                     bool verify_result = AlipaySignature.RSACheckV1(map, alipayPublicKey, charset, signType, keyFromFile);
139                     Log.Info("AliPayNotifyUrl验签", verify_result + "");
140 
141                     //验签成功后,按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验,校验成功后再response中返回success并继续商户自身业务处理,校验失败返回false
142                     if (verify_result)
143                     {
144                         //商户订单号
145                         string out_trade_no = map["out_trade_no"];
146                         //支付宝交易号
147                         string trade_no = map["trade_no"];
148                         //交易创建时间
149                         string gmt_create = map["gmt_create"];
150                         //交易付款时间
151                         string gmt_payment = map["gmt_payment"];
152                         //通知时间
153                         string notify_time = map["notify_time"];
154                         //通知类型  trade_status_sync
155                         string notify_type = map["notify_type"];
156                         //通知校验ID
157                         string notify_id = map["notify_id"];
158                         //开发者的app_id
159                         string app_id = map["app_id"];
160                         //卖家支付宝用户号
161                         string seller_id = map["seller_id"];
162                         //买家支付宝用户号
163                         string buyer_id = map["buyer_id"];
164                         //实收金额
165                         string receipt_amount = map["receipt_amount"];
166                         //交易状态
167                         string return_code = map["trade_status"];
168 
169                         //交易状态TRADE_FINISHED的通知触发条件是商户签约的产品不支持退款功能的前提下,买家付款成功;
170                         //或者,商户签约的产品支持退款功能的前提下,交易已经成功并且已经超过可退款期限
171                         //状态TRADE_SUCCESS的通知触发条件是商户签约的产品支持退款功能的前提下,买家付款成功
172                         if (return_code == "TRADE_FINISHED" || return_code == "TRADE_SUCCESS")
173                         {
174                             string msg;
175 
176                             Log.Error("AliPayNotifyUrl", receipt_amount + "==" + trade_no + "==" + return_code + "==" + out_trade_no + "==" + gmt_payment);
177 
178                             //判断该笔订单是否在商户网站中已经做过处理
179                             ///支付回调的业务处理
180                             //bool res = OrderBll.Value.CompleteAliPay(receipt_amount, trade_no, return_code, out_trade_no, gmt_payment, out msg);
181                             bool res = true;
182 
183                             if (res == false)
184                             {
185                                 Response.Write("添加支付信息失败!");
186                             }
187                             Log.Error("AliPayNotifyUrl", "支付成功");
188                             Response.Write("success");  //请不要修改或删除
189                         }
190                     }
191                     else
192                     {
193                         //验证失败
194                         Log.Error("AliPayNotifyUrl", "支付验证失败");
195                         Response.Write("验证失败!");
196                     }
197                 }
198                 catch (Exception e)
199                 {
200                     Response.Write("添加支付信息失败!");
201                     Log.Error("AliPayNotifyUrl", "添加支付信息失败");
202                 }
203             }
204             else
205             {
206                 //无返回参数
207                 Response.Write("无返回参数!");
208                 Log.Error("AliPayNotifyUrl", "无返回参数");
209             }
210         }
211         //[AllowUser]
212         //public ActionResult TestAliPay()
213         //{
214 
215         //    var receipt_amount = "0.01";
216         //    var trade_no = "20181226220013.......";
217         //    var return_code = "TRADE_SUCCESS";
218         //    var out_trade_no = "20181226103124129";
219         //    var gmt_payment = "2018-12-26 10:31:29";
220 
221         //    string msg = "";
222         //    bool res = OrderBll.Value.CompleteAliPay(receipt_amount, trade_no, return_code, out_trade_no, gmt_payment, out msg);
223 
224         //    return Json(res);
225         //}
226 
227         /// <summary>
228         /// 获取支付宝Get过来的通知消息,并以“参数名=参数值”的形式组成数组
229         /// </summary>
230         /// <returns></returns>
231         public IDictionary<string, string> GetRequestGet()
232         {
233             Pay.Log Log = new Pay.Log(Pay.AliPay.AliPayConfig.LogPath);
234             int i = 0;
235             IDictionary<string, string> sArry = new Dictionary<string, string>();
236             NameValueCollection coll;
237             coll = Request.QueryString;
238 
239             String[] requstItem = coll.AllKeys;
240 
241             for (i = 0; i < requstItem.Length; i++)
242             {
243                 Log.Info("GetRequestGet", requstItem[i] + ":" + Request.QueryString[requstItem[i]]);
244                 sArry.Add(requstItem[i], Request.QueryString[requstItem[i]]);
245             }
246 
247             return sArry;
248         }
249 
250         /// <summary>
251         /// 获取支付宝POST过来通知消息,并以“参数名=参数值”的形式组成数组
252         /// </summary>
253         /// <returns>request回来的信息组成的数组</returns>
254         public IDictionary<string, string> GetRequestPost()
255         {
256             Pay.Log Log = new Pay.Log(Pay.AliPay.AliPayConfig.LogPath);
257             int i = 0;
258             IDictionary<string, string> sArray = new Dictionary<string, string>();
259             NameValueCollection coll;
260 
261             //Load Form variables into NameValueCollection variable.
262             coll = Request.Form;
263 
264             // Get names of all forms into a string array.
265             String[] requestItem = coll.AllKeys;
266             for (i = 0; i < requestItem.Length; i++)
267             {
268                 Log.Info("GetRequestPost", requestItem[i] + ":" + Request.Form[requestItem[i]]);
269                 sArray.Add(requestItem[i], Request.Form[requestItem[i]]);
270             }
271 
272             return sArray;
273         }
274     }
275 }
View Code

 

.NET支付宝App支付接入的实例分析

.NET支付宝App支付接入的实例分析

一、前言

       最近也是为了新产品忙得起飞,博客都更新的慢了。新产品为了方便用户支付,需要支付宝扫码接入。这活落到了我的身上。产品是Windows系统下的桌面软件,通过软件生成二维码支付。界面以原生的MVVM编写,下面叙述一下基本的过程,做过的老司机可以直接点关闭了。

二、申请接口

        申请接口是第一步,首先有这么几件事:

  1. 公司具有支付宝账户

  2. 公司具有营业资质(废话)

  3. 创建应用,签约电脑网站支付,手机支付,App支付。

  4. 创建私钥、公钥、支付宝公钥

  5. 配置网关及回调地址

        需要注意的是以下几点:

  1. 创建应用时,名称不要带有“支付”、“pay”等字样,图片建议高清

  2. 创建应用时,签约支付需要一些申请材料,如:营业资质照片,公司照片4张,应用的介绍(名称,下载地址,公司网站是否有该应用,该应用出现支付宝支付的界面样式)

  3. 签约后需要审核,大致一天,(阿里确实快,腾讯微信要4天),审核通过会发送一份邮件,里面有链接,点击链接完成签约

  4. 创建私钥、公钥、支付宝公钥,在支付宝接口网站上有官方工具,下载使用即可

  5. 网关与回调地址要与公司网站形成关联,比如是二级域名;如果网关、回调地址与公司网站没什么联系,恐怕不行。

三、代码流程

        有三个构成元素。客户端软件,商户服务器后台,支付宝后台

        客户端软件点击“获取支付二维码”去获得一个可支付的二维码:

        封装客户端的一些必要信息发送给商户服务器后台形成一个商户订单

        /// <summary>
        /// 获取二维码信息        /// </summary>
        /// <param name="packageClientInfo">封装信息</param>
        /// <param name="serverAddress">商户产品服务器地址</param>
        /// <returns></returns>
        public static void GetQRCodeInfo(string packageClientInfo, string serverAddress, Action<string> getQRCodeAction)
        {            if (!string.IsNullOrEmpty(packageClientInfo))
            {                try
                {
                    HttpClient httpsClient = new HttpClient
                    {
                        BaseAddress = new Uri(serverAddress),
                        Timeout = TimeSpan.FromMinutes(20)
                    };                    if (DsClientOperation.ConnectionTest(httpsClient))
                    {
                        StringContent strData = new StringContent(
                                                           packageClientInfo,
                                                           Encoding.UTF8,
                                                           RcCommonNames.JasonMediaType);                        
                                                           string PostUrl = httpsClient.BaseAddress + "api/AlipayForProduct/GetQRCodeString";
                        Uri address = new Uri(PostUrl);
                        Task<HttpResponseMessage> response = httpsClient.PostAsync(address, strData);
                        response.ContinueWith(
                            (postTask) =>
                            {                                
                            if (postTask.IsFaulted)
                                {                                    
                                throw postTask.Exception;
                                }
                                HttpResponseMessage postResponse = postTask.Result;
                                postResponse.EnsureSuccessStatusCode();                                
                                var result = postResponse.Content.ReadAsStringAsync().Result;
                                getQRCodeAction(JsonConvert.DeserializeObject<string>(result)); //注意这个委托                      
                                          return result;
                            });
                    }
                }                catch
                {                    // ignored                }
            }
        }
登录后复制

这里的委托方法是用来生成二维码的,当你从这个“api/AlipayForProduct/GetQRCodeString”返回一些字符串(result),比如返回的是:

"http://xxx.xxx.com/AlipayForProduct/SendInfoToAlipay?ordernumber=" + $"{orderNumber}";(orderNumber为商户订单号)

然后使用ThoughtWorks.QRCode.dll去生成二维码

        /// <summary>
        /// 根据字符串得到相应的二维码        /// </summary>
        /// <param name="qrInfo"></param>
        /// <param name="productName"></param>
        /// <param name="version"></param>
        /// <returns></returns>
        public static Image CreateQRCodeImage(string qrInfo, string productName, string version)
        {            try
            {                if (!string.IsNullOrEmpty(qrInfo))
                {
                    QRCodeEncoder encoder = new QRCodeEncoder
                    {
                        QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE,
                        QRCodeScale = 4,
                        QRCodeVersion = 0,
                        QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M
                    };                    
                    //编码方式(注意:BYTE能支持中文,ALPHA_NUMERIC扫描出来的都是数字)                    
                    //大小(值越大生成的二维码图片像素越高)                    
                    //版本(注意:设置为0主要是防止编码的字符串太长时发生错误)                    
                    //错误效验、错误更正(有4个等级)
                    Image image = encoder.Encode(qrInfo, Encoding.GetEncoding("utf-8"));                    
                    string filename = $"{productName}_{version}.png";                    
                    var userLocalPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);                    
                    var docPath = Path.Combine(userLocalPath, @"YourProduct\QRCode");                    
                    if (!Directory.Exists(docPath))
                    {
                        Directory.CreateDirectory(docPath);
                    }                    string filepath = Path.Combine(docPath, filename); 
                    using (FileStream fs = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write))
                    {
                        image.Save(fs, System.Drawing.Imaging.ImageFormat.Png);
                        fs.Close();
                        image.Dispose();
                    }                    return image;
                }
            }            catch (Exception)
            {                return null;
            }            return null;
        }
登录后复制

这样就产生了二维码,说白了,就是把一个服务的api由字符串变成了图片,当用户使用支付宝app去扫这个二维码时,会去请求这个api:

"http://xxx.xxx.com/AlipayForProduct/SendInfoToAlipay?ordernumber=" + $"{orderNumber}";(orderNumber为商户订单号)

          orderNumber = Request[ (! matchedItem = db.OrderInfoForProduct.FirstOrDefault(x => x.OrderNumber == (matchedItem !=  && matchedItem.IsPaid == 
                     alipayServerURL =  app_id = privateKeyPem = format =  version =  signType = 
                     out_trade_no = orderNumber; 
                     product_code = ; 
                     total_amount = ;  
                     subject = ; 
                     body = ; =  returnurl = $ notifyurl == =  +                                      + body +  +                                      + subject +  +                                      + out_trade_no +  +                                      + total_amount +  +                                      + product_code +  +                                     
                    requestWap.SetReturnUrl(returnurl); = pNone =  + responseWap.Body +
登录后复制

异步请求一般需要做这么几件事:

  1. 用户扫码支付完之后,支付宝后台会把所有需要验证的信息发给你,除了一个参数不需要验签完,其余都需要验签;

  2. 如果验签成功且支付状态也是成功交易后,你需要更新商户服务器后台关于此条商户订单的状态,比如将其支付状态变成已支付,填充支付时间等等;

 
          <, > sPara = (sPara.Count > 
                 sign_type = Request.Form[
                 seller_id = Request.Form[]; 
                 trade_status = Request.Form[]; 
                 notify_time = Request.Form[]; 
                 app_id = Request.Form[]; 
                 out_trade_no = Request.Form[]; 
                 total_amount = Request.Form[]; 
                 receipt_amount = Request.Form[]; 
                 invoice_amount = Request.Form[]; 
                 buyer_pay_amount = Request.Form[]; 
                 body = Request.Form[]; 
                 gmt_payment = Request.Form[]; 

                 tradeGuid = 
                 isVerfied = AlipaySignature.RSACheckV1(sPara, alipayPublicKey, , sign_type,  (app_id == appID && seller_id == isTradeSuccess = .Equals(trade_status, ) || .Equals(trade_status,  (
登录后复制

同步请求一般需要做这么几件事:

1. 当异步调用完后,如果支付成功而且商户服务器后台对此条订单号处理也正确的话;同步请求可以再做一次验证

2. 如果验证成功,跳转支付成功页面;如果失败,跳转支付失败页面。

        public ActionResult AlipayResult()
        {
            SortedDictionary<string, string> sPara = GetRequestGet();            if (sPara.Count > 0)
            {                //非验签参数
                var sign_type = Request.QueryString["sign_type"];                //接收参数并排序
                var seller_id = Request.QueryString["seller_id"]; //卖家支付宝用户号
                var app_id = Request.QueryString["app_id"]; //开发者AppId
                var out_trade_no = Request.QueryString["out_trade_no"]; //交易订单号

                var orderNumberGuid = new Guid(out_trade_no);                try
                {                    var isVerfied = AlipaySignature.RSACheckV1(sPara, alipayPublicKey, "utf-8", sign_type, false);    
                                if (isVerfied)
                    {                        if (app_id == appID && seller_id == sellerID)
                        {
                           //你的支付成功页面
                        }
                    }

                }                catch
                {
                   //你的支付失败页面
                }
            }            else
            {               //你的支付失败页面
            }            return View();
        }        /// <summary>
        /// 参数排序字典        /// </summary>
        /// <returns></returns>
        private SortedDictionary<string, string> GetRequestGet()
        {
            SortedDictionary<string, string> sArray = new SortedDictionary<string, string>();
            NameValueCollection coll = Request.QueryString;

            String[] requestItem = coll.AllKeys;            foreach (string t in requestItem)
            {
                sArray.Add(t, Request.QueryString[t]);
            }            return sArray;
        }
登录后复制

 

以上就是.NET支付宝App支付接入的实例分析的详细内容,更多请关注php中文网其它相关文章!

android app(个人应用)怎么集成支付宝支付功能

android app(个人应用)怎么集成支付宝支付功能

我想做一个android app集成支付宝支付功能的demo。

把官方demo下载下来导入到eclipse,然后修改PartnerConfig里的配置信息,再运行在手机上面,提示“订单签名错误,请检查partner对应的密钥是否正确”。

我在支付宝无线商户平台咨询在线小二得到的回复是个人app无法集成支付宝的无线产品功能

不知道是不是这样?

那个人app能使用支付宝那块功能呢?小二那边回复也是使用不了  - - 汗汗汗

App 集成支付宝支付接口(三)Java服务器端配置

App 集成支付宝支付接口(三)Java服务器端配置

官方文档

移动支付:

https://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103563&docType=1

app支付

https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.4qQzLr&treeId=204&articleId=105051&docType=1

服务端,app支付demo中还没有,所以参考移动支付。

app支付是移动支付的升级版,配置方面也有一点点区别,我刚使用,所以就摈弃掉老版本了,如果各位看官有兴趣可以自己去捣鼓一下。

解压“WS_MOBILE_PAY_SDK_BASE_1.0.zip”,进入Java 服务器目录。

你可以用eclipse直接导入项目,也可以复制相关文件到自己已经创建好的项目中。(我是将文件复制到已经存在的项目中)

然后需要修改alipayconfig类中的参数,支付宝里面使用到的一些不会变化的参数也可以添加到这个类里面来。

package org.fengzhi.server.alipay.config;

/* *
 *类名:AlipayConfig
 *功能:基础配置类
 *详细:设置帐户有关信息及返回路径
 *版本:1.0
 *日期:2016-06-06
 *说明:
 *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
 */

public class AlipayConfig {
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

    //合作身份者ID,签约账号,以2088开头由16位纯数字组成的字符串,查看地址:https://openhome.alipay.com/platform/keyManage.htm?keyType=partner
    public static String partner = "2088******704";

    //商户的私钥,需要PKCS8格式,RSA公私钥生成:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.nBDxfy&treeId=58&articleId=103242&docType=1
    public static String private_key = "QcXe**********************************nKlU1OEbG3L";

    //支付宝的公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm?keyType=partner
    public static String alipay_public_key = "MIGfMA0****************i3eof7TcZ32oWpwIDAQAB";

    // 签名方式
    public static String sign_type = "RSA";
    // 调试用,创建TXT日志文件夹路径,见AlipayCore.java类中的logResult(String sWord)打印方法。
    public static String log_path = "d://alipay//";
    // 字符编码格式 目前支持 gbk 或 utf-8
    public static String input_charset = "utf-8";
    // 接收通知的接口名
    public static String service = "http://www.alipay.com/pay/verifySign.html";
    public static String app_id = "2016********71";
    // 商家唯一标识,自己随意填写。
    public static String target_id = "alipay************";

//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
}

客户端获取签名数据和支付宝异步通知

import com.alipay.api.internal.util.AlipaySignature;
import org.fengzhi.server.alipay.config.AlipayConfig;
import org.fengzhi.server.alipay.service.IAlipayService;
import org.fengzhi.server.alipay.util.AlipayNotify;
import org.fengzhi.server.alipay.util.OrderInfoUtil2_0;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.logging.Logger;

@Controller
@RequestMapping(value = "/pay", produces = "text/html, charset=utf-8")
public class AlipayNotifyController {

    public Logger log = Logger.getLogger(getClass().getName());

    @Autowired
    public IAlipayService alipayService;


    @ResponseBody
    @RequestMapping(value = "/getOrderInfo", method = RequestMethod.GET)
    public String getOrderInfo(String body, String subject, String outTradeNo, String totalAmount) throws Exception {
        // 请求参数拼接
        Map<String, String> publicData = OrderInfoUtil2_0.buildOrderParamMap(body, subject, outTradeNo, totalAmount);
        // 对参数进行签名
        String sign = OrderInfoUtil2_0.getSign(publicData, AlipayConfig.private_key);
        //
        String orderParam = OrderInfoUtil2_0.buildOrderParam(publicData);
        final String orderInfo = orderParam + "&" + sign;

        return orderInfo;
    }


    @RequestMapping(value = "/verifySign", method = RequestMethod.POST)
    public void verifySign(HttpServletRequest request, HttpServletResponse response) throws Exception {
        PrintWriter out = response.getWriter();

        //获取支付宝POST过来反馈信息
        Map<String, String> params = new HashMap<String, String>();
        Map requestParams = request.getParameterMap();
        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
            String name = (String) iter.next();
            String[] values = (String[]) requestParams.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i]
                        : valueStr + values[i] + ",";
            }
            //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "UTF-8");
            params.put(name, valueStr);
        }

        //异步通知ID
        String notify_id = request.getParameter("notify_id");

        //判断接受的post通知中有无notify_id,如果有则是异步通知。
        if (notify_id != null && notify_id != "") {
            //判断成功之后使用getResponse方法判断是否是支付宝发来的异步通知。
            if (AlipayNotify.verifyResponse(notify_id).equals("true")) {

                // 调用sdk验证签名
                boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.input_charset);

                if (signVerified) {
                    log.info("验签成功!");

                    //商户订单号
                    String outTradeo = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
                    // 总金额
                    double totalAmount = new Double(new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8"));
                    // 商家id
                    String sellerId = new String(request.getParameter("seller_id").getBytes("ISO-8859-1"), "UTF-8");
                    // 应用id
                    String appId = new String(request.getParameter("app_id").getBytes("ISO-8859-1"), "UTF-8");

                    //验证业务内容是否正确
                    boolean businessVerified = alipayService.verifyBusinessData(outTradeo, totalAmount, sellerId, appId);

                    if (businessVerified) {
                        //交易状态
                        String tradeStatus = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");

                        if (tradeStatus.equals("TRADE_SUCCESS")) {
                            // 支付成功处理方式

                            // 更新商户系统中用户交易订单信息等等。。。

                            out.print("success");
                        } else {
                            // 支付失败处理方式

                            out.print("failure");
                        }
                    }
                }
            } else {
                log.info("验证是否来自支付宝的通知失败!");
            }
        }

    }
}

 

 

 

 

 

 

 

今天关于php 服务端集成支付宝APP支付实例php app支付宝支付接口的分享就到这里,希望大家有所收获,若想了解更多关于.Net后台实现支付宝APP支付、.NET支付宝App支付接入的实例分析、android app(个人应用)怎么集成支付宝支付功能、App 集成支付宝支付接口(三)Java服务器端配置等相关知识,可以在本站进行查询。

本文标签:

上一篇php自定义二维数组排序函数array_orderby用法示例(php 二维数组排序)

下一篇HTML – 我希望我的textarea有一个固定的宽度