标签: php

IOS App Store 服务端支付接口开发

首先 “苹果禁止在app中提供第三方支付” 所以但凡是做IOS App的,需要充值的地方都会遇到服务端充值的功能需要开发。

充值的大体流程是这样的,App内在购买成功后,会得到一个从苹果AppStore服务器得到一个本次交易数据的字符串,即收据(Receipt),Receipt中包含了本次交易的几乎所有信息,前面这部分的内容都是由App内实现,所以服务端不用去管。

App拿到Receipt之后,向应用的服务端(即用户自己的服务器)请求发送本次交易的Receipt及当前用户的唯一标识。服务端再从Receipt中获取到交易信息,并发往苹果的AppStore服务器验证交易信息的真伪,验证通过后则修改当前App用户的账户余额信息(为了防止越狱和IAP free等插件造成的欺诈性购买)。之后将增加后的用户余额信息返回给App引用,此时用户看到app上显示充值成功并且自己的账户余额也发生了变化。

与服务器端的通信,就是一个RPC的过程,服务器端写好一些供调用的API接口,在客户端联网调用,具体有什么xmlrpc, jsonrpc的,都有开源的框架可以使用。注意:客户端与游戏服务器端通信的时候,必需附带一个标识其身份的代码(UUID或者帐号名称),否则服务器端无法知道是谁进行了充值。

参见:接口开发文档

Continue reading

将数组被print_r出的字符串重新转换回PHP数组

和同事一起开发一个页面,因为进度问题,分工我帮写view层和一个稍微有点复杂的JS,同事那边controller层提供一个数组给我所需要的数据。因为同事有急事,当天走的匆忙,所以只给了我一个数组print_r后的字符串,因为数组较大,手动修改工作量很大,所以就google了下
找寻到如下代码,可以完美将字符串重新转换回数组。

特在此分享:

function print_r_reverse(&$output)
{
    // 0=nothing in particular, 1=array open paren ‘(‘, 2=array element or close paren ‘)’
    $expecting = 0; 
    $lines = explode("\n", $output);
    $result = null;
    $topArray = null;
    $arrayStack = array();
    $matches = null;
    while (!empty($lines) && $result === null){
        $line = array_shift($lines);
        $trim = trim($line);
        if ($trim == 'Array'){
            if ($expecting == 0){
                $topArray = array();
                $expecting = 1;
            }else{
                trigger_error("Unknown array.");
            }
        }else if ($expecting == 1 && $trim == '('){
            $expecting = 2;
        }else if ($expecting == 2 && preg_match('/^\[(.+?)\] \=\> (.+)$/', $trim, $matches)){
               // array element
            list ($fullMatch, $key, $element) = $matches;
            if (trim($element) == 'Array'){
                $topArray[$key] = array();
                $newTopArray =& $topArray[$key];
                $arrayStack[] =& $topArray;
                $topArray =& $newTopArray;
                $expecting = 1;
            }else{
                $topArray[$key] = $element;
            }
        }else if ($expecting == 2 && $trim == ')'){
             // end current array
            if (empty($arrayStack)){
                $result = $topArray;
            }else{
                 // pop into parent array
                 // safe array pop
                $keys = array_keys($arrayStack);
                $lastKey = array_pop($keys);
                $temp =& $arrayStack[$lastKey];
                unset($arrayStack[$lastKey]);
                $topArray =& $temp;
            }
        }else if (!empty($trim) && $expecting == 2){
            // Added this to allow for multi line strings.
            // Expecting close parent or element, but got just a string
            $topArray[$key] .= "\n".$line;
        }else if (!empty($trim)){
            $result = $line;
        }
    }
    $output = implode(n, $lines);
    return $result;
}

/**
* @param string $output : The output of a multiple print_r calls, separated by newlines
* @return mixed[] : parseable elements of $output
*/
function print_r_reverse_multiple($output){
    $result = array();
    while (($reverse = print_r_reverse($output)) !== NULL){
        $result[] = $reverse;
    }
    return $result;
}
$str = "Array(
    [0] => Array(
        [play_type_id] => 102
        [play_type_name] => 三亚+其他
    )
    [1] => Array(
        [play_type_id] => 172
        [play_type_name] => 三亚一地
    )
)";
$arr = print_r_reverse($str);