docs: def apply_signing(self, plan_id, contract_code, contract_display_account, notify_url,
                        version="1.0", clientip=None, deviceid=None, mobile=None, email=None, qq=None,
                        request_serial=None, openid=None, creid=None, outerid=None):
          """
          申请签约 api
  
          https://pay.weixin.qq.com/wiki/doc/api/pap.php?chapter=18_1&index=1
  
          :param plan_id: 模板id 协议模板id，设置路径见开发步骤。
          :param contract_code: 签约协议号 商户侧的签约协议号，由商户生成
          :param contract_display_account: 用户账户展示名称 签约用户的名称，用于页面展示，页面样例可见案例与规范
          :param notify_url: 回调通知url 用于接收签约成功消息的回调通知地址，以http或https开头。
          :param version: 版本号 固定值1.0
          :param request_serial: 可选 请求序列号 商户请求签约时的序列号，商户侧须唯一。序列号主要用于排序，不作为查询条件
          :param clientip: 可选 客户端 IP 点分IP格式(客户端IP)
          :param deviceid: 可选 设备ID android填imei的一次md5; ios填idfa的一次md5
          :param mobile: 可选 手机号 用户手机号
          :param email: 可选 邮箱地址 用户邮箱地址
          :param qq: 可选 QQ号 用户QQ号
          :param openid: 可选 微信open ID 用户微信open ID
          :param creid: 可选 身份证号 用户身份证号
          :param outerid: 可选 商户侧用户标识 用户在商户侧的标识
          :return: 返回的结果数据字典
          """
          timestamp = int(time.time())
          if request_serial is None:
              request_serial = int(time.time() * 1000)
          data = {
              "appid": self.appid,
              "mch_id": self.mch_id,
              "sub_mch_id": self.sub_mch_id,
              "plan_id": plan_id,
              "contract_code": contract_code,
              "request_serial": request_serial,
              "contract_display_account": contract_display_account,
              "notify_url": notify_url,
              "version": version,
              "timestamp": timestamp,
              "clientip": clientip,
              "deviceid": deviceid,
              "mobile": mobile,
              "email": email,
              "qq": qq,
              "openid": openid,
              "creid": creid,
              "outerid": outerid,
          }
          data = optionaldict(data)
          sign = calculate_signature(data, self._client.api_key)
          data["sign"] = sign
          return {
              "base_url": "{}papay/entrustweb".format(self._client.API_BASE_URL),
              "data": data
          }