友盟+搜索

{{errorMsg}}

微社区积分系统概念

积分和货币

货币特性提供了交易,提供更加核心的,类似的转账和交易的需要。 在pointbank中体现为point和currency字段 积分两种不同的性质,不同的需要,因而进行了拆分,分为point和currency两个字段,point(积分)为衡量用户的部分,currency(货币)为提供交易部分,point变化能够引起货币变化,货币的交易活动则不能引起积分的变化

货币的作用

(1)事务保证 相较于积分和业务之间耦合,货币更加单纯的作用。因为使用了分布式事务,占用了更多的计算资源,不对货币的实时性做出保证(异步的计算模式)。

(2)安全保证 货币提供了IP限制等等限制来保证,锁定等等方法来约束。当然以后会有更多的约束来保证安全性需要。

接口开放逻辑

(1)积分产生货币 积分1对1 产生货币,用户的行为产生积分,同时增加锁定货币,当货币解锁之后,就可以通过server的货币操作接口使用/v2/pointbank/currency/op/ 针对惩罚性质的较少货币,将直接减少锁定货币,锁定货币减少完成之后,减少解锁货币。 货币操作接口,将对用户的解锁货币值进行即时操作。

(2) 原有积分 针对货币开放了调用接口,在货币调用或者积分变换的时候,会做积分到货币的拷贝,保证了货币的数据来源。

(3)积分SDK开放 因为对积分作用做了很大的弱化,货币的交易概念大大增强。积分通过SDK进行开放。

积分调用说明

相关配置

1) 设置可行的IP地址
进行货币的操作调用,需要固定的IP,因为会对ip等等信息做出校验

2) 设置锁定积分时间
推荐时间锁定积分时间为48小时。为了和原有社区结合,原有启用社区积分的系统的默认时间为0小时。

3) 管理后台设置

接口说明

一:SDK端封装了3个接口

Android版SDK积分接口说明

iOS版SDK积分接口说明

二:增减用户货币信息必须在服务器端完成,调用步骤

1)首先通过appkey获取对应的accesstoken

2)通过货币接口,更新货币信息

获取accesstoken

接口地址
https://api.wsq.umeng.com//v2/user/token/

参数 传输方式 参数说明
ak get Appkey
_t_ get
_s_ get 校验串,参见注1
_e_ get md5
params_data post appkey和ak的aes加密串,加密数据原格式参见注2

货币接口,更新货币信息

接口地址
https://api.wsq.umeng.com/v2/pointbank/currency/op/

参数 传输方式 参数说明
ak get Appkey
_t_ get
_s_ get 校验串,通过md5加密,参见注1
_e_ get md5
params_data post appkey和ak的aes加密串,加密方法与货币接口相同,
fuid post 用户id
community_id post 社区ID
currency post 货币
desc post 描述,长度小于200字节
ak post appkey
use_unit post 是否使用unit(0/1,默认为0)
identity post 业务id,使用唯一值(低于128位的ID)

注1:_s_ 加密方式:例:md5("POST:/v2/user/token/:1463385837:ak=ak&encrypted_data=encrypted_data:AppSecret")
注2:params_data 加密数据的原格式:例:{"ak":ak,"encrypted_data":encrypted_data},具体方法参见[Post字段加密方法]

Post字段加密方法

执行步骤:
(1)加密数据/转码
使用AES对参数进行加密,加密的key使用和app对应的appsecret。填充方式使用MODE_CBC, 加密iv使用appsecret的前16位。
Python样例

class prpcrypt():
    def __init__(self, key):
        self.key = key
        self.mode = AES.MODE_CBC
        self.iv = self.key[:16]
    def encrypt(self, text):
        cryptor = AES.new(self.key, self.mode, self.iv)
        length = 32
        count = len(text)
        amount = length - (count % length)
        if amount == 0:
            amount = length
        pad_chr = chr(amount & 0xFF)
        new_text = text + (pad_chr * amount)
        ciphertext = cryptor.encrypt(new_text)
        return ciphertext

对加密后的二进制代码,进行base64转码

encrypted_data = base64.b64encode(ciphertext)

(2)拼接参数
将必须的参数ak,encrypted_data,加上接口参数,进行http以&连接的参数,并以字段序列排序。

params_data = {"ak":ak,"encrypted_data":encrypted_data}
if need_params:
    params_data.update(need_params)
url_params = sorted(params_data.iteritems(), key=lambda d:d[0])
url_params = [ (item[0], item[1].encode('utf-8')) if isinstance(item[1], unicode) else item for item in url_params]
url_params = [ item[0]+"="+str(item[1]) for item in url_params]
url_params = "&".join(url_params)

(3)参数的MD5签名
将接口使用方法:接口路径:时间戳(int值):接口参数:appsecret进行摘要

m = hashlib.md5()
t = int(time.time())
info = "POST:%s:%d:%s:%s" %(url_path,t, url_params, secret)
m.update(info)
signdata = m.hexdigest()

(4)接口调用

url = "https://api.wsq.umeng.com/v2/pointbank/currency/op/?ak=%s&_t_=%d&_s_=%s&_e_=%s&sdkv=2.5.0" %(ak, t, signdata, "md5")

post参数使用ak, encrypted_data

params_data = {"ak":ak,"encrypted_data":encrypted_data} header = {"accesstoken":access_token} r = requests.post(url, data = params_data, headers=header)

注: 因为微社区开发了auth层,因为auth层针对SDK,H5并没有针对server端调用的情况,需要按照SDK的方式进行使用(sdkv=2.5.0为了和sdk进行统一)。

样例

Python

详情请看Demo

Java

详情请看Demo

其他语言

敬请期待!