最近我在为“星点无线”产品增加手机支付功能,支付当然首先想到的是支付宝,而且也在其他类似无线产品里看到集成支付宝应用。
首先在支付宝无线商户平台里签约,我们分别签了“手机网页支付”和“手机应用内支付”,所在行业的费率会有所不同,请根据实际情况选择,“手机网页支付”和“手机应用内支付”的费率也不同,“手机应用内支付”低一些。
最开始,我只想简单一点,在iOS应用里内嵌Web,采用手机网页支付,服务器端是用PHP,手机网页支付,采用MD5和RSA两种签名方式,MD5相对简单,但安全性不如RSA,我最开始测试MD5,而且之前在网站上集成支付宝,也没啥问题,开始是比较顺利的,到支付宝支付时,支付宝默认选择了短信支付方式(可能和我们签约的分类有关),也就是支付宝会通过手机短信发送一个验证码,然后回复验证码,支付宝再会发送一个短信,短信里包含一个URL,点击这个URL,会提示支付完成,然后转到我们网站的回调地址,我方程序完整成个订单,但支付宝提供的这个URL,有时候打开会报错误,而且也不是每次都错,非常的奇怪,更大的问题是在成功后回调我服务器程序时报签名不对,我仔细检查了配置,没有问题,只能一点点排错,最后发现支付宝提供的Demo包里alipay_function.php的para_filter方法有问题,这个方法会漏掉回传的out_trade_no参数,非常的奇怪,只有修改这个方法为
function para_filter($parameter) {
$para = array();
foreach ($parameter as $key=>$val) {
if($key == "sign" || $key == "sign_type" || $val == "") {
continue;
} else {
$para[$key] = $parameter[$key];
}
}
return $para;
}
签名问题解决,但由于短信支付最后这个URL的诡异表现,我为此专门询问支付宝客户支持,得到的回答是他们也发现这个问题,但不知道是什么原因造成的,技术也解决不了,竟然也有支付宝解决不了的问题啊!
这个问题不能解决,确实对用户的体验不太好,我只能选择“手机应用内支付”,支付宝提供了iOS的集成代码,文档也算详尽,但iOS的签名采用RSA,所以在服务器端先要改为RSA的(RSA的alipay_function.php para_filter方法有同样的问题),生成公钥、私钥的方法在文档里比较清楚,就是注意上传商户公钥时一定要删除文件头“—–BEGIN PUBLIC KEY—–”与文件尾“—–END PUBLIC KEY—–”还有空格、换行,变成一行字符串并保存为TXT文件,商户私钥在PHP程序不需要转为PKCS8格式,而在其他语言里(比如Objective-C)需要转为PKCS8格式,并在iOS应用里设置plist文件中RSA private key变量时,要把PKCS8格式私钥的换行和头尾的“—–BEGIN PRIVATE KEY—–”与“—–END PRIVATE KEY—–”删除。
在iPhone真机调试过程中,跳到支付宝应用时报签名错误,我又仔细检查了好几遍,确定没什么问题,后来在支付宝的指导下先测试运行他们提供的Demo程序,没有问题,说明签名密钥没问题,肯定是要签名的数据有问题,我对比了一下发现AlixPayOrder中的productDescription不能为空,也就是传输数据中的body变量不能为空,终于完成了无线支付的集成。
支付宝提供的文档还算比较全面,但有些地方还是有些含糊,如果是iOS集成的话,先测试它提供的Demo程序,以确定密钥的正确性,仔细调试,记录Log,还是比较容易集成的。
今天,星点无线1.5已经通过App Store的审核,上架了,地址在http://itunes.apple.com/cn/app/id448294946?mt=8,也可以在App Store里搜索“星点无线”或是“StarryMobile”找到这个应用。
星点无线1.5的主要改变有
全新UI设计
支持iOS5
更加舒适的用户体验
提高运行速度与稳定性
支持调查任务筛选与优惠券排序
增加信息推送功能
修复优惠券显示文字高度的BUG
星点无线1.0和1.1的原始程序是我们找外包团队开发的,1.0和1.1发布时,我已经修改了其中很多的代码,在我们设计1.5的功能时,我觉得,不能在1.0/1.1的基础上改了,老版本存在许多的问题,特别是在性能及内存使用方面有很多不足,代码整体质量不高,我准备重写1.5版本,来个干净彻底,我是10.1假期之后开始重写,在美工设计的配合下,到10月底完成了这个版本,期间iOS5正好发布,这个工程也转到iOS5下开发。



星点调查 for iPad已在10月6日通过App Store的审核,上线了,星点调查是一款依托与星点调查平台的调研终端工具,支持多种调查题型,可以帮助商业用户快速进行调研数据收集,有兴趣的朋友可以下载使用:http://itunes.apple.com/us/app/id467284642?mt=8
星点调查是我独立编写的iOS程序,并且是建立在星点调查开放平台之上(http://open.starrysurvey.com/),因此验证了星点调查开放平台可以方便的为企业灵活构建调查业务。

星点无线-StarryMobile是一个免费的iPhone应用程序,通过完成基于地理位置的调查任务,可以获得积分或相关优惠券,用户可以方便的管理与使用获得优惠券,或将积分兑换为奖品。
这个产品是我们公司开发的,我编写了其中很大一部分代码,也是我对iOS开发的第一次实践,在后面将不断增加新的功能,并与我们的星点网(www.xingdian.com)有更好的整合。
欢迎大家到App Store里下载使用,http://itunes.apple.com/us/app/id448294946?mt=8


最近做了一个星点调查的iPad客户端程序,提交App Store审核之后被打回了,说程序只支持纵向显示,在用户翻转之后(即Home键在上面时)也应该能正常显示。
我想只要在shouldAutorotateToInterfaceOrientation方法里加上反向的支持就可以了,即
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown);
}
但是修改之后,发一些页面没有问题,但有些页面还是不能正常显示,有些情况下翻转屏幕有效,有些情况下不行,我百思不得其解,搜索了大量资料(大多是英文的,中文的几乎没有),但也没有完全能解释清楚的,我只能不算试错,发现似乎是UINavigationController默认情况下不能支持UIInterfaceOrientationPortraitUpsideDown,网上的资料也好像提到这个原因,我仔细检查了一下,我的UINavigationController用法似乎不太对,于是我新建一个类,继承自UINavigationController,重写其shouldAutorotateToInterfaceOrientation方法,使其支持UIInterfaceOrientationPortraitUpsideDown,试了一下,果然好了:)