上代码:

public class AppStorePayApp
{
public int VerifyReceipt(string receipt, out string product_id, out string transaction_id)
{
product_id = "";
transaction_id = "";
try
{
string sandbox_url = "https://sandbox.itunes.apple.com/verifyReceipt";
string product_url = "https://buy.itunes.apple.com/verifyReceipt";

string ReturnVal = Post(product_url, receipt); JObject retJOBJ = ReturnVal.ToJObject(); if (retJOBJ["status"] == null)
{
return 0;
} if (Convert.ToInt32(retJOBJ["status"]) == 21007)//测试环境
{
ReturnVal = Post(sandbox_url, receipt); retJOBJ = ReturnVal.ToJObject(); if (retJOBJ["status"] == null || Convert.ToInt32(retJOBJ["status"]) != 0)
{
return 0;
}
} if (Convert.ToInt32(retJOBJ["status"]) == 0)
{
product_id = retJOBJ["receipt"]["in_app"][0]["product_id"].ToString();
transaction_id = retJOBJ["receipt"]["in_app"][0]["transaction_id"].ToString();return 1;
} return 0;
}
catch (Exception ex)
{
} return 0;
} public string Post(string verify_url, string receipt)
{
WebRequest request = WebRequest.CreateHttp(verify_url);
request.Method = "POST";
request.ContentType = "application/json"; if (!string.IsNullOrEmpty(receipt))
{
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
streamWriter.Write(receipt);
streamWriter.Flush();
streamWriter.Close();
}
}
System.Net.WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("utf-8"));
string ReturnVal = reader.ReadToEnd();
reader.Close();
response.Close();
return ReturnVal;
}
}

验证思路:先进行正式环境的验证,得到status=21007说明receipt得到的沙盒测试环境的值,需要使用测试地址进行验证。

参数receipt,ios客户端传递过来的参数:

ios相关

1、 从Transaction 的TransactionReceipt属性中得到接收的数据,并以base64编码;

2、创建JSON对象,字典格式,单键值对,键名为“receiptdata”,值为上一次编码的数据,效果:

{"receipt-data":"base64编码之后的数据"}

3、将这个json对象以字符串形式发送到服务器

结果判断status=0代表验证成功可以进行业务处理,主要该验证可以重复进行,所需要服务器端根据字段:transaction_id进行唯一性处理,避免业务处理出现错误。

product_id字段可以作为价格的判断,需要与客户端开发所提交的加个保持一致。

IOS 内付 asp.net mvc 服务器端验证的更多相关文章

  1. ASP.NET MVC 2 验证

    来源:http://www.cnblogs.com/jhxk/articles/2612885.html  只为把自己觉的好的存起来 对用户输入的验证以及强制业务规则/逻辑是大多数web应用的核心需求 ...

  2. ASP.NET MVC Model验证(二)

    ASP.NET MVC Model验证(二) 前言 上篇内容演示了一个简单的Model验证示例,然后在文中提及到Model验证在MVC框架中默认所处的位置在哪?本篇就是来解决这个问题的,并且会描述一下 ...

  3. [ASP.NET MVC2 系列] ASP.Net MVC教程之《在15分钟内用ASP.Net MVC创建一个电影数据库应用程序》

    [ASP.NET MVC2 系列]      [ASP.NET MVC2 系列] ASP.Net MVC教程之<在15分钟内用ASP.Net MVC创建一个电影数据库应用程序>       ...

  4. ASP.NET MVC Model验证(五)

    ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它 ...

  5. ASP.NET MVC Model验证(四)

    ASP.NET MVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而Mod ...

  6. ASP.NET MVC Model验证(三)

    ASP.NET MVC Model验证(三) 前言 上篇中说到在MVC框架中默认的Model验证是在哪里验证的,还讲到DefaultModelBinder类型的内部执行的示意图,让大家可以看到默认的M ...

  7. ASP.NET MVC Model验证(一)

    ASP.NET MVC Model验证(一) 前言 前面对于Model绑定部分作了大概的介绍,从这章开始就进入Model验证部分了,这个实际上是一个系列的Model的绑定往往都是伴随着验证的.也会在后 ...

  8. ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view)

    在本节中,您将验证电影控制器生成的编辑方法(Edit action methods)和视图.但是首先将修改点代码,使得发布日期属性(ReleaseDate)看上去更好.打开Models \ Movie ...

  9. 【MVC】ASP.NET MVC Forms验证机制

    http://www.cnblogs.com/bomo/p/3309766.html 随笔 - 121  文章 - 0  评论 - 92 [MVC]ASP.NET MVC Forms验证机制 ASP. ...

  10. 通过扩展改善ASP.NET MVC的验证机制[实现篇]

    原文:通过扩展改善ASP.NET MVC的验证机制[实现篇] 在<使用篇>中我们谈到扩展的验证编程方式,并且演示了本解决方案的三大特性:消息提供机制的分离.多语言的支持和多验证规则的支持, ...

随机推荐

  1. Git+Gitee使用分享

    Git+Gitee快速入门 创建仓库 ​ ​ ​ 初始化本地仓库 验证本地git是否安装好 打开cmd窗口,输入git ​ 这样就OK. Git 全局设置:(只需要设置一次) 这台电脑如果是第一次使用 ...

  2. 【报错解决】【人工智能】【深度学习】验证cuda和tensorflow之间的版本对应关系时遇到的问题

    验证环境B 验证成功,没有问题 验证环境A 得到结果false 检查是否与CUDA关联成功 tf.test.is_built_with_cuda() 发现没有关联成功 根据查询可知道,失败的原因是1. ...

  3. dubbo(一)spring schema拓展技术

    https://blog.csdn.net/java_zldz_xuws/article/details/84648398 在阐述dubbo原理之前,我先介绍一下dubbo与spring怎么糅合在一块 ...

  4. Qt音视频开发20-vlc内核动态保存录像文件(不需要重新编译源码)

    一.前言 在vlc默认提供的保存文件方式中,通过打开的时候传入指定的参数来保存文件,直到关闭播放生成文件,这种方式简单暴力,但是不适用大部分的场景,大部分时候需要的是提供开始录制和停止录制的功能,也就 ...

  5. Qt开发经验小技巧236-240

    关于在头文件中定义函数使用static关键字的血的教训. 有时候我们需要将一些常用函数写在一个文件中供很多地方调用,如果写的是 int doxxx{} 这种,在你多个地方引用的时候,肯定会编译报错提示 ...

  6. 万字长文:手把手教你实现一套高效的IM长连接自适应心跳保活机制

    本文作者"Carson",现就职于腾讯公司,原题"高效保活长连接:手把手教你实现自适应的心跳保活机制",有较多修订和改动. 1.引言 当要实现IM即时通讯聊天. ...

  7. Datawhale AI 夏令营-天池Better Synth多模态大模型数据合成挑战赛-task3持续上分(更新中)

    在大数据.大模型时代,随着大模型发展,互联网数据渐尽且需大量处理标注,为新模型训练高效合成优质数据成为新兴问题."天池 Better Synth - 多模态大模型数据合成挑战赛"应 ...

  8. 浅说c/c++ coroutine

    浅说c/c++ coroutine 从上面我们可以得到关于协程的几个关键信息, 1.打破传统(regular)函数调用的限制. 2.stackful协程实现方式,基于独立栈,上下文切换. 3.stac ...

  9. vs2017 iisexpress 绑定自定义域名

    1.项目根目录找到 项目/.vs/config/applicationhost.config 2.添加绑定域名 <site name="demo" id="2&qu ...

  10. Docker 迁移数据目录

    Centos7 环境,采用yum安装的,默认数据目录在/var/lib/docker中 1. 关闭docker服务 systemctl stop docker 2. 备份和迁移 # 迁移 cp -r ...