zdzdbk

上周突然遇到让开发今日头条小程序(字节跳动小程序)的需求,然后看了下文档发现真的简陋。而且文档有错别字。槽点有点多。但是和老版本的小程序相差不多,然后我就抱着试一试的心态,真的是试一试把微信小程序换了个id,然后打包上传,发现竟然跑的通!跑的通!跑的通!再说一次跑的通。当时我的内心是崩溃的,说好的tt.标签那,这样照搬真的好吗,好歹稍微改下啊。

先说下遇到的提审不通过的几个原因:

  1、在部分页面有微信分享或者微信二维码等和微信有关的东西(因为是直接把微信小程序扔过去的所有清楚有点麻烦)

  2、要求页面不能有空白,没东西最少要有文字提示,这个算是一开始没想到的用户体验性

  3、视频要求能够下拉页面跳过的时候自动暂停或者悬浮窗显示(因为文档不详细,网上资料很少,社区资料 也没有,特别吐槽,社区的官方人员回应速度慢,基本都是扔个文档链接或者示例,感觉对开发者很不友好,特别是在文档不是太清晰的问题)

遇到的坑,主要在支付这边,其他地方有问题的可以参考微信小程序,文档基本通用。头条因为没有自己的支付渠道,所以使用的是支付宝,利用tt.requestPayment()调起支付宝APP支付:

支付具体流程为:后端通过openid和自己这边的订单号生成一个头条的订单号,具体操作可以看文档流程,然后生成调用支付宝的一个字符串,这里需要使用支付宝文档,我使用的支付宝SDK,这边支付宝文档很好的,网上资料很多。最后就是组装后返回给前端调用支付宝。特别注意的是这里使用的所有appid等参数都是头条分配给商户的appid等。

  1、签名,在官方文档中,支付接入文档中,有签名说明和签名不通过说明,这里有个坑就是,签名说明是下单的签名的说明,签名不通过说明与示例是前端调用支付宝APP的签名。

  我的代码,这里为了方便展示,用的拼接:

$biz_content = array(

            \'out_order_no\' => $ordersn,

            \'uid\' => $openid,

            \'merchant_id\' => $ttshcode[$appid],

            \'total_amount\' =>$order[\'orderAmount\'] ? $order[\'orderAmount\'] * 100 : 0,

            \'currency\' => \'CNY\',

            \'subject\' => $order[\'goodsName\'] ? $order[\'goodsName\'] :\'名称\' ,

            \'body\' => $ordersn.\',\'.$order[\'orderAmount\'],

            \'trade_time\' => $time,

            \'valid_time\' => \'60\',

            \'notify_url\' => \'http://www.******.com\',

            \'risk_info\' => \'127.0.0.1\',

        );


        $biz_content = json_encode($biz_content);

        $data[\'app_id\'] = $ttapppay[$appid];

        $data[\'biz_content\'] = $biz_content;

        $data[\'charset\'] = \'utf-8\';

        $data[\'method\'] = \'tp.trade.create\';

        $data[\'sign_type\'] = \'MD5\';

        $data[\'timestamp\'] = $time;

        $data[\'version\'] = \'1.0\';

        ksort($data);

        $var = \'\';

        foreach($data as $key => $value){

            $var .= $key.\'=\'.$value.\'&\';

        }
        $var = trim($var,\'&\');


        $c = $var.$secret;

        $data[\'sign\'] = MD5($c);
  
        ksort($data);

        $vars = \'\';
        $vars = \'app_id=\'.$data[\'app_id\'].\'&biz_content=\'.$data[\'biz_content\'].\'&charset=\'.$data[\'charset\'].\'&method=\'.$data[\'method\'].\'&sign=\'.$data[\'sign\'].\'&sign_type=\'.$data[\'sign_type\'].\'&timestamp=\'.$data[\'timestamp\'].\'&version=\'.$data[\'version\'];
        $url = \'https://tp-pay.snssdk.com/gateway\';
     //进行post请求

2.支付宝这边支付的字符串参考支付宝文档生成

3.前端调用支付宝app,这边示例有个坑就是在支付宝字符串外面有一个花括号,这里有就提示签名错误,

代码示例:

     $goodsName = $order[\'goodsName\'] ? $order[\'goodsName\'] :\'名称\';
        $urls = $this->alipay_get($goodsName,$datas[\'response\'][\'trade_no\'] , $order[\'orderAmount\']); //这里是我写了个方法调用支付宝SDK的签名函数

        $list[\'app_id\'] = $ttapppay[$appid]; // test
        $list[\'method\'] = \'tp.trade.confirm\';
        $list[\'sign_type\'] = MD5;
        $list["uid"]=$openid;
        $list["total_amount"]=$order[\'orderAmount\'] ? $order[\'orderAmount\']*100 : 0;
        $list[\'timestamp\'] = time();
        $list[\'pay_channel\'] = "ALIPAY_NO_SIGN";
        $list["pay_type"] = "ALIPAY_APP";
        $list["trade_no"]= $datas[\'response\'][\'trade_no\'];
        $list["merchant_id"]= $ttshcode[$appid];
        $list["risk_info"]= $this->input->ip_address();
        $list["uid"]=$openid;
        $arrParam=array("url" =>  $urls);
        $strParam=json_encode($arrParam);
        $list["params"]=$strParam;
        $list[\'url\'] =$urls;
        $signKeys=array("app_id","sign_type","timestamp","trade_no","merchant_id","uid","total_amount","params");
        $signData=array();
        foreach ($signKeys as $v) {
            $signData[$v] = $list[$v];
        }

        ksort($signData);
        $var = \'\';
        foreach($signData as $key => $value){
            $var .= $key.\'=\'.$value.\'&\';
        }
        $var = trim($var,\'&\');
        $list[\'sign\'] = MD5($var . $secret);
$datas[\'response\'][\'trade_no\']为生成的单号。
4.前端代码:
var obj = JSON.parse(res.data.data);//

                tt.requestPayment({
                    data: {
                        app_id: obj.app_id,
                        method: \'tp.trade.confirm\',
                        sign: obj.sign,
                        sign_type: \'MD5\',
                        timestamp: obj.timestamp.toString(),
                        trade_no: obj.trade_no,
                        merchant_id: obj.merchant_id,
                        uid: obj.uid,
                        total_amount: obj.total_amount,
                        pay_channel: \'ALIPAY_NO_SIGN\',
                        pay_type: \'ALIPAY_APP\',
                        risk_info: "{\'ip\':\'"+obj.risk_info+"\'}",
                        params: JSON.stringify({
                                url:obj.url
                           }),
                        return_url: \'https://***********/\',
                        show_url: \'https://*********/\',
                    },
                    success (res) {
                        succ(res);
                        console.log(res);
                    },
                    fail (res) {
                        console.log(res);
                        wx.showModal({
                            title: \'支付失败\',
                            content: \'\',
                            complete (res) {
                                return tt.navigateTo({
                                    url: \'/pages/user/orders/orders\'
                                });
                            }
                        });
                        fail(res);
                    }
                })

我这边后端返回的是json格式,前端转换为对象。

 

补充一下最近遇到的问题,上线的小程序更新被打回好几次,最后发现是字节跳动那边开通了抖音小程序,在抖音可以打开原先头条的小程序,然而之前的接口在抖音有部分不能使用(比如调用地址接口),而且文档未说明,也没有给通知,这样真的不太好

分类:

技术点:

相关文章: